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

# Disconnect Service

> Disconnect from a service

## Endpoint

```
POST /api/connect/disconnect
```

## Overview

Disconnects the authenticated user from a service by setting the `connected` flag to `false`. The service entitlement remains but is marked as disconnected.

## Request

<ParamField body="service" type="ServiceIdentifier" required>
  Service identifier: `DROP`, `MAILS`, `VAULT`, or `DB`
</ParamField>

## Response

<ResponseField name="connected" type="boolean">
  Always `false` on success
</ResponseField>

<ResponseField name="service" type="string">
  Service identifier
</ResponseField>

<ResponseField name="tier" type="string">
  Access tier
</ResponseField>

<ResponseField name="isPremium" type="boolean">
  Premium access flag
</ResponseField>

<ResponseField name="message" type="string">
  "Successfully disconnected from service"
</ResponseField>

## Implementation Details

### Code Reference

```14:97:nullpass_clean/src/app/api/connect/disconnect/route.ts theme={null}
export async function POST(request: NextRequest) {
  const corsResponse = handleCors(request)
  if (corsResponse) return corsResponse

  const blocked = await protectRoute(request)
  if (blocked) return blocked

  const auth = await requireAuth(request)
  if ('error' in auth) return auth.error

  try {
    const body = await request.json()
    const validated = disconnectSchema.parse(body)

    logger.ups('Service disconnect request:', auth.userId, validated.service)

    const existingEntitlement = await prisma.userServiceEntitlement.findUnique({
      where: {
        userId_service: {
          userId: auth.userId,
          service: validated.service,
        },
      },
    })

    if (!existingEntitlement) {
      return errorResponse(
        'Service entitlement not found. Please ensure you have access to this service.',
        404,
        request.headers.get('origin')
      )
    }

    if (!(existingEntitlement as any).connected) {
      return jsonResponse(
        {
          connected: false,
          service: validated.service,
          message: 'Already disconnected from this service',
        },
        200,
        request.headers.get('origin')
      )
    }

    const entitlement = await prisma.userServiceEntitlement.update({
      where: {
        userId_service: {
          userId: auth.userId,
          service: validated.service,
        },
      },
      data: {
        connected: false,
        updatedAt: new Date(),
      } as any,
    })

    await createAuditLog(auth.userId, 'SERVICE_ENTITLEMENT_DISCONNECT', {
      service: validated.service,
    })

    logger.info('Service disconnected:', auth.userId, validated.service)

    return jsonResponse(
      {
        connected: false,
        service: entitlement.service,
        tier: entitlement.tier,
        isPremium: entitlement.isPremium,
        message: 'Successfully disconnected from service',
      },
      200,
      request.headers.get('origin')
    )
  } catch (error: any) {
    if (error.name === 'ZodError') {
      logger.warn('Disconnect service validation error:', error.errors)
      return errorResponse(error.errors[0].message, 400, request.headers.get('origin'))
    }
    logger.error('Disconnect service error:', error)
    return errorResponse('Internal server error', 500, request.headers.get('origin'))
  }
}
```

## Status Codes

<ResponseField name="200" type="OK">
  Successfully disconnected or already disconnected
</ResponseField>

<ResponseField name="400" type="Bad Request">
  Validation error
</ResponseField>

<ResponseField name="401" type="Unauthorized">
  Missing or invalid authentication token
</ResponseField>

<ResponseField name="404" type="Not Found">
  Service entitlement not found
</ResponseField>

## Example Request

```bash theme={null}
curl -X POST https://auth.nullpass.xyz/api/connect/disconnect \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "service": "DROP"
  }'
```

## Example Response

```json theme={null}
{
  "connected": false,
  "service": "DROP",
  "tier": "premium",
  "isPremium": true,
  "message": "Successfully disconnected from service"
}
```

## Audit Events

* **SERVICE\_ENTITLEMENT\_DISCONNECT**: Service disconnected successfully


## OpenAPI

````yaml POST /connect/disconnect
openapi: 3.1.0
info:
  title: Null Pass API
  description: >-
    Internal API documentation for Null Pass authentication and service
    management system
  version: 1.0.0
servers:
  - url: https://auth.nullpass.xyz/api
security: []
paths:
  /connect/disconnect:
    post:
      tags:
        - Services
      summary: Disconnect Service
      description: Disconnect from a service
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - service
              properties:
                service:
                  type: string
                  enum:
                    - DROP
                    - MAILS
                    - VAULT
                    - DB
      responses:
        '200':
          description: Service disconnected
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````