import { CodeTabs, CodeTab } from "docs-ui"

export const metadata = {
  title: `Examples of the API Key Module`,
}

# {metadata.title}

In this guide, you’ll find common examples of how you can use the API Key Module in your application.

## Create an API Key

<CodeTabs groupId="app-type">
  <CodeTab label="Medusa API Router" value="medusa">

  ```ts
  import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
  import { IApiKeyModuleService } from "@medusajs/types"
  import { ModuleRegistrationName } from "@medusajs/modules-sdk"

  export async function POST(
    request: MedusaRequest,
    res: MedusaResponse
  ) {
    const apiKeyModuleService: IApiKeyModuleService =
      request.scope.resolve(ModuleRegistrationName.API_KEY)

    const apiKey = await apiKeyModuleService.create({
      title: "Publishable API key",
      type: "publishable",
      created_by: "user_123",
    })

    res.json({
      api_key: apiKey,
    })
  }
  ```

  </CodeTab>
  <CodeTab label="Next.js App Router" value="nextjs">

  ```ts
  import { NextResponse } from "next/server"

  import {
    initialize as initializeApiKeyModule,
  } from "@medusajs/api-key"

  export async function POST(request: Request) {
    const apiKeyModuleService = await initializeApiKeyModule()

    const apiKey = await apiKeyModuleService.create({
      title: "Publishable API key",
      type: "publishable",
      created_by: "user_123",
    })

    return NextResponse.json({
      api_key: apiKey,
    })
  }
  ```

  </CodeTab>
</CodeTabs>

---

## List API Keys

<CodeTabs groupId="app-type">
  <CodeTab label="Medusa API Router" value="medusa">

  ```ts
  import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
  import { IApiKeyModuleService } from "@medusajs/types"
  import { ModuleRegistrationName } from "@medusajs/modules-sdk"

  export async function GET(
    request: MedusaRequest,
    res: MedusaResponse
  ) {
    const apiKeyModuleService: IApiKeyModuleService =
      request.scope.resolve(ModuleRegistrationName.API_KEY)

    res.json({
      api_keys: await apiKeyModuleService.list(),
    })
  }
  ```

  </CodeTab>
  <CodeTab label="Next.js App Router" value="nextjs">

  ```ts
  import { NextResponse } from "next/server"

  import {
    initialize as initializeApiKeyModule,
  } from "@medusajs/api-key"

  export async function GET(request: Request) {
    const apiKeyModuleService = await initializeApiKeyModule()

    return NextResponse.json({
      api_keys: await apiKeyModuleService.list(),
    })
  }
  ```

  </CodeTab>
</CodeTabs>

---

## Revoke an API Key

<CodeTabs groupId="app-type">
  <CodeTab label="Medusa API Router" value="medusa">

  ```ts
  import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
  import { IApiKeyModuleService } from "@medusajs/types"
  import { ModuleRegistrationName } from "@medusajs/modules-sdk"

  export async function POST(
    request: MedusaRequest,
    res: MedusaResponse
  ) {
    const apiKeyModuleService: IApiKeyModuleService =
      request.scope.resolve(ModuleRegistrationName.API_KEY)

    const revokedKey = await apiKeyModuleService.revoke(
      request.params.id
    )

    res.json({
      api_key: revokedKey,
    })
  }
  ```

  </CodeTab>
  <CodeTab label="Next.js App Router" value="nextjs">

  ```ts
  import { NextResponse } from "next/server"

  import {
    initialize as initializeApiKeyModule,
  } from "@medusajs/api-key"

  type ContextType = {
    params: {
      id: string
    }
  }

  export async function POST(
    request: Request,
    { params }: ContextType
  ) {
    const apiKeyModuleService = await initializeApiKeyModule()

    const revokedKey = await apiKeyModuleService.revoke(params.id)

    return NextResponse.json({
      api_key: revokedKey,
    })
  }
  ```

  </CodeTab>
</CodeTabs>

---

## Verify Token

<CodeTabs groupId="app-type">
  <CodeTab label="Medusa API Router" value="medusa">

  ```ts
  import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
  import { IApiKeyModuleService } from "@medusajs/types"
  import { ModuleRegistrationName } from "@medusajs/modules-sdk"

  export async function POST(
    request: MedusaRequest,
    res: MedusaResponse
  ) {
    const apiKeyModuleService: IApiKeyModuleService =
      request.scope.resolve(ModuleRegistrationName.API_KEY)

    const authenticatedToken =
      await apiKeyModuleService.authenticate(request.params.id)

    res.json({
      is_authenticated: !!authenticatedToken,
    })
  }
  ```

  </CodeTab>
  <CodeTab label="Next.js App Router" value="nextjs">

  ```ts
  import { NextResponse } from "next/server"

  import {
    initialize as initializeApiKeyModule,
  } from "@medusajs/api-key"

  type ContextType = {
    params: {
      id: string
    }
  }

  export async function POST(
    request: Request,
    { params }: ContextType
  ) {
    const apiKeyModuleService = await initializeApiKeyModule()

    const authenticatedToken =
      await apiKeyModuleService.authenticate(request.params.id)

    return NextResponse.json({
      is_authenticated: !!authenticatedToken,
    })
  }
  ```

  </CodeTab>
</CodeTabs>

---

## Roll API Key

<CodeTabs groupId="app-type">
  <CodeTab label="Medusa API Router" value="medusa">

  ```ts
  import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"
  import { IApiKeyModuleService } from "@medusajs/types"
  import { ModuleRegistrationName } from "@medusajs/modules-sdk"

  export async function POST(
    request: MedusaRequest,
    res: MedusaResponse
  ) {
    const apiKeyModuleService: IApiKeyModuleService =
      request.scope.resolve(ModuleRegistrationName.API_KEY)

    const revokedKey = await apiKeyModuleService.revoke(
      request.params.id
    )

    const newKey = await apiKeyModuleService.create({
      title: revokedKey.title,
      type: revokedKey.type,
      created_by: revokedKey.created_by,
    })

    res.json({
      api_key: newKey,
    })
  }
  ```

  </CodeTab>
  <CodeTab label="Next.js App Router" value="nextjs">

  ```ts
  import { NextResponse } from "next/server"

  import {
    initialize as initializeApiKeyModule,
  } from "@medusajs/api-key"

  type ContextType = {
    params: {
      id: string
    }
  }

  export async function POST(
    request: Request,
    { params }: ContextType
  ) {
    const apiKeyModuleService = await initializeApiKeyModule()

    const revokedKey = await apiKeyModuleService.revoke(params.id)

    const newKey = await apiKeyModuleService.create({
      title: revokedKey.title,
      type: revokedKey.type,
      created_by: revokedKey.created_by,
    })

    return NextResponse.json({
      api_key: newKey,
    })
  }
  ```

  </CodeTab>
</CodeTabs>

---

## More Examples

The [module interface reference](/references/api-key) provides a reference to all the methods available for use with examples for each.
