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

# Live Face Swap

> Real-time Face Swap API Documentation

<Warning>Generated resources (images, videos) are valid for 7 days. Please save related resources promptly to prevent expiration.</Warning>

## Overview

Live Face Swap API provides real-time face swap functionality, supporting real-time face swap operations during live streaming.

## Get Access Token

Before calling other APIs, you need to obtain an access token first.

```bash theme={null}
POST https://openapi.akool.com/api/open/v3/getToken
```

**Request Headers**

| **Parameter** | **Value** | **Description** |
| - | - | - |
| Content-Type | application/json | Request content type |

**Request Body**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| clientId | String | Client ID |
| clientSecret | String | Client secret |

**Example Request**

```json theme={null}
{
    "clientId": "AKX5brZQ***XBQSk=",
    "clientSecret": "tcMhvgV0fY***WQ2eIoEY70rNi"
}
```

## Face Detection

Detect faces in an image and get facial landmarks coordinates.

```bash theme={null}
POST https://sg3.akool.com/detect
```

**Request Headers**

| **Parameter** | **Value** | **Description** |
| - | - | - |
| Authorization | Bearer token | API key for request authorization |
| Content-Type | application/json | Request content type |

**Request Body**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| single\_face | Boolean | Whether to detect single face only |
| image\_url | String | Image URL for face detection |
| img | String | Base64 encoded image (optional) |

**Example Request**

```json theme={null}
{
    "single_face": false,
    "image_url": "https://d21ksh0k4smeql.cloudfront.net/1745579943557-yr5w-crop_1728989585247-3239-0-1728989585409-9277.png"
}
```

**Response**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| error\_code | int | Error code (0: success) |
| error\_msg | String | Error message |
| landmarks | Array | Facial landmarks coordinates array |
| landmarks\_str | Array | Facial landmarks coordinates string array |
| region | Array | Face region coordinates |
| seconds | float | Processing time in seconds |
| trx\_id | String | Transaction ID |

**Response Example**

```json theme={null}
{
    "error_code": 0,
    "error_msg": "SUCCESS",
    "landmarks": [
        [
            [249, 510],
            [460, 515],
            [343, 657],
            [255, 740],
            [0, 0],
            [0, 0]
        ]
    ],
    "landmarks_str": [
        "249,510:460,515:343,657:255,740"
    ],
    "region": [
        [150, 264, 437, 657]
    ],
    "seconds": 0.6554102897644043,
    "trx_id": "64498285-446f-462d-9470-fe36c36c6eac"
}
```

## Create Real-time Face Swap Session

Create a new real-time face swap session.

```bash theme={null}
POST https://openapi.akool.com/api/open/v3/faceswap/live/create
```

**Request Headers**

| **Parameter** | **Value** | **Description** |
| - | - | - |
| Authorization | Bearer token | API key for request authorization |
| Content-Type | application/json | Request content type |

**Request Body**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| sourceImage | Array | Source image information array, each element contains path and opts properties |

**Example Request**

```json theme={null}
{
    "sourceImage": [
        {
            "path": "https://d21ksh0k4smeql.cloudfront.net/crop_1695201165222-7514-0-1695201165485-8149.png",
            "opts": "262,175:363,175:313,215:272,279"
        }
    ]
}
```

**Response**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| code | int | API response business status code (1000: success) |
| msg | String | API response status information |
| data | Object | Response data object |

**Response Example**

```json theme={null}
{
    "code": 1000,
    "msg": "OK",
    "data": {
        "_id": "684f8fb744b8795862e45cbe",
        "faceswap_status": 1,
        "front_user_id": "1",
        "algorithm_user_id": "3",
        "front_rtc_token": "007eJxTYFj/uGvaue3C3/VlOLdFmM5UuffmzHGhszbnTSqs3or94HNRYEhNNElJM0oxMkg1MTYxMklMMkm0MDCySDW0sDBOMjRP297vnyHAx8Bw6YAZIyMDIwMLAyMDiM8EJpnBJAuYFGMwMjAyNTAzNDMwNrI0tTQ0MIy3MDIyYWQwBADtwSJM",
        "channel_id": "20250616032959101_8224",
        "app_id": ""
    }
}
```

**Status Code Description**

* `faceswap_status`:
  * 1: Queuing
  * 2: Processing (when this value is 2, the frontend can connect to Agora's server)
  * 3: Success
  * 4: Failed

## Update Real-time Face Swap Session

Update existing real-time face swap session configuration.

```bash theme={null}
POST https://openapi.akool.com/api/open/v3/faceswap/live/update
```

**Request Headers**

| **Parameter** | **Value** | **Description** |
| - | - | - |
| Authorization | Bearer token | API key for request authorization |
| Content-Type | application/json | Request content type |

**Request Body**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| \_id | String | Session ID |
| sourceImage | Array | Source image information array, each element contains path and opts properties |

**Example Request**

```json theme={null}
{
    "sourceImage": [
        {
            "path": "https://d21ksh0k4smeql.cloudfront.net/1745579943557-yr5w-crop_1728989585247-3239-0-1728989585409-9277.png",
            "opts": "249,510:460,515:343,657:255,740"
        }
    ],
    "_id": "685ea0bb5aa150dd8b7116b1"
}
```

**Response Example**

```json theme={null}
{
    "code": 1000,
    "msg": "OK"
}
```

## Close Real-time Face Swap Session

Close the specified real-time face swap session.

```bash theme={null}
POST https://openapi.akool.com/api/open/v3/faceswap/live/close
```

**Request Headers**

| **Parameter** | **Value** | **Description** |
| - | - | - |
| Authorization | Bearer token | API key for request authorization |
| Content-Type | application/json | Request content type |

**Request Body**

| **Parameter** | **Type** | **Description** |
| - | - | - |
| \_id | String | Session ID |

**Example Request**

```json theme={null}
{
    "_id": "685ea0bb5aa150dd8b7116b1"
}
```

**Response Example**

```json theme={null}
{
    "code": 1000,
    "msg": "OK"
}
```

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  # Get token
  curl -X POST "https://openapi.akool.com/api/open/v3/getToken" \
      -H "Content-Type: application/json" \
      -d '{
          "clientId": "AKX5brZQ***XBQSk=",
          "clientSecret": "tcMhvgV0fY***WQ2eIoEY70rNi"
      }'

  # Face detection
  curl -X POST "https://sg3.akool.com/detect" \
      -H "Authorization: Bearer token" \
      -H "Content-Type: application/json" \
      -d '{
          "single_face": false,
          "image_url": "https://d21ksh0k4smeql.cloudfront.net/1745579943557-yr5w-crop_1728989585247-3239-0-1728989585409-9277.png"
      }'

  # Create session
  curl -X POST "https://openapi.akool.com/api/open/v3/faceswap/live/create" \
      -H "Authorization: Bearer token" \
      -H "Content-Type: application/json" \
      -d '{
          "sourceImage": [
              {
                  "path": "https://d21ksh0k4smeql.cloudfront.net/crop_1695201165222-7514-0-1695201165485-8149.png",
                  "opts": "262,175:363,175:313,215:272,279"
              }
          ]
      }'

  # Update session
  curl -X POST "https://openapi.akool.com/api/open/v3/faceswap/live/update" \
      -H "Authorization: Bearer token" \
      -H "Content-Type: application/json" \
      -d '{
          "sourceImage": [
              {
                  "path": "https://d21ksh0k4smeql.cloudfront.net/1745579943557-yr5w-crop_1728989585247-3239-0-1728989585409-9277.png",
                  "opts": "249,510:460,515:343,657:255,740"
              }
          ],
          "_id": "685ea0bb5aa150dd8b7116b1"
      }'

  # Close session
  curl -X POST "https://openapi.akool.com/api/open/v3/faceswap/live/close" \
      -H "Authorization: Bearer token" \
      -H "Content-Type: application/json" \
      -d '{
          "_id": "685ea0bb5aa150dd8b7116b1"
      }'
  ```

  ```javascript JavaScript theme={null}
  // Get token
  const getToken = async () => {
      const response = await fetch('https://openapi.akool.com/api/open/v3/getToken', {
          method: 'POST',
          headers: {
              'Content-Type': 'application/json'
          },
          body: JSON.stringify({
              clientId: 'AKX5brZQ***XBQSk=',
              clientSecret: 'tcMhvgV0fY***WQ2eIoEY70rNi'
          })
      });
      return response.json();
  };

  // Face detection
  const detectFace = async (token, imageUrl) => {
      const response = await fetch('https://sg3.akool.com/detect', {
          method: 'POST',
          headers: {
              'Authorization': `Bearer ${token}`,
              'Content-Type': 'application/json'
          },
          body: JSON.stringify({
              single_face: false,
              image_url: imageUrl
          })
      });
      return response.json();
  };

  // Create session
  const createSession = async (token, sourceImage) => {
      const response = await fetch('https://openapi.akool.com/api/open/v3/faceswap/live/create', {
          method: 'POST',
          headers: {
              'Authorization': `Bearer ${token}`,
              'Content-Type': 'application/json'
          },
          body: JSON.stringify({
              sourceImage: sourceImage
          })
      });
      return response.json();
  };

  // Update session
  const updateSession = async (token, sessionId, sourceImage) => {
      const response = await fetch('https://openapi.akool.com/api/open/v3/faceswap/live/update', {
          method: 'POST',
          headers: {
              'Authorization': `Bearer ${token}`,
              'Content-Type': 'application/json'
          },
          body: JSON.stringify({
              _id: sessionId,
              sourceImage: sourceImage
          })
      });
      return response.json();
  };

  // Close session
  const closeSession = async (token, sessionId) => {
      const response = await fetch('https://openapi.akool.com/api/open/v3/faceswap/live/close', {
          method: 'POST',
          headers: {
              'Authorization': `Bearer ${token}`,
              'Content-Type': 'application/json'
          },
          body: JSON.stringify({
              _id: sessionId
          })
      });
      return response.json();
  };
  ```

  ```python Python theme={null}
  import requests
  import json

  # Get token
  def get_token():
      url = "https://openapi.akool.com/api/open/v3/getToken"
      payload = {
          "clientId": "AKX5brZQ***XBQSk=",
          "clientSecret": "tcMhvgV0fY***WQ2eIoEY70rNi"
      }
      headers = {'Content-Type': 'application/json'}
      response = requests.post(url, headers=headers, json=payload)
      return response.json()

  # Face detection
  def detect_face(token, image_url):
      url = "https://sg3.akool.com/detect"
      payload = {
          "single_face": False,
          "image_url": image_url
      }
      headers = {
          'Authorization': f'Bearer {token}',
          'Content-Type': 'application/json'
      }
      response = requests.post(url, headers=headers, json=payload)
      return response.json()

  # Create session
  def create_session(token, source_image):
      url = "https://openapi.akool.com/api/open/v3/faceswap/live/create"
      payload = {
          "sourceImage": source_image
      }
      headers = {
          'Authorization': f'Bearer {token}',
          'Content-Type': 'application/json'
      }
      response = requests.post(url, headers=headers, json=payload)
      return response.json()

  # Update session
  def update_session(token, session_id, source_image):
      url = "https://openapi.akool.com/api/open/v3/faceswap/live/update"
      payload = {
          "_id": session_id,
          "sourceImage": source_image
      }
      headers = {
          'Authorization': f'Bearer {token}',
          'Content-Type': 'application/json'
      }
      response = requests.post(url, headers=headers, json=payload)
      return response.json()

  # Close session
  def close_session(token, session_id):
      url = "https://openapi.akool.com/api/open/v3/faceswap/live/close"
      payload = {
          "_id": session_id
      }
      headers = {
          'Authorization': f'Bearer {token}',
          'Content-Type': 'application/json'
      }
      response = requests.post(url, headers=headers, json=payload)
      return response.json()
  ```
</CodeGroup>

## Response Code Description

> **Note:** If the `code` value in the response is not `1000`, the request has failed or is incorrect.

| **Parameter** | **Value** | **Description** |
| - | - | - |
| code | 1000 | Success |
| code | 1003 | Parameter error or parameter cannot be empty |
| code | 1101 | Invalid authorization or the request token has expired |
| code | 1102 | Authorization cannot be empty |
| code | 1104 | Insufficient quota |

## Important Notes

1. **Resource Validity**: Generated resources are valid for 7 days, please save them promptly
2. **Face Detection**: Use the face-detect API to get face landmarks coordinates before creating face swap sessions
3. **Status Monitoring**: After creating a session, you need to monitor the `faceswap_status` status
4. **Real-time Connection**: When the status is 2, you can connect to Agora's server for real-time face swap
5. **Session Management**: Please close sessions promptly after use to release resources
6. **Error Handling**: Please handle API error codes and error messages properly

## Push and pull stream Demo References

For implementing real-time video communication with Agora SDK, you can refer to the following resources:

### Basic Video Calling Demo Parameter Description

![Basic Video Calling Demo Parameter Description](https://d21ksh0k4smeql.cloudfront.net/openapi/images/live-faceswap-demo-ui.png)

As shown in the figure above, `channel_id`, `front_user_id`, and `front_rtc_token` correspond to the Channel, User ID, and Token input fields on the page respectively.
These parameters can be obtained after creating a session through the Live Face Swap API. After filling them in, you can experience push/pull streaming and real-time face swap effects.

### Demo Page

* **Live Demo**: [https://webdemo-global.agora.io/example/basic/basicVideoCall/index.html](https://webdemo-global.agora.io/example/basic/basicVideoCall/index.html)

### Source Code

* **GitHub Repository**: [https://github.com/AgoraIO/API-Examples-Web/tree/main/src/example/basic/basicVideoCall](https://github.com/AgoraIO/API-Examples-Web/tree/main/src/example/basic/basicVideoCall)

### Recommended Track Configuration

For optimal performance in live face swap scenarios, it's recommended to use the following track configurations:

#### Audio Track Configuration

```javascript theme={null}
const audioTrack = await AgoraRTC.createMicrophoneAudioTrack({
  encoderConfig: "music_standard",
});
```

#### Video Track Configuration

```javascript theme={null}
const videoTrack = await AgoraRTC.createCameraVideoTrack({
  encoderConfig: {
    width: 640,
    height: 480,
    frameRate: {max: 20, min: 20},
    bitrateMin: 5000,
    bitrateMax: 5000,
  },
});
```

These configurations are optimized for:

* **Audio**: Using `music_standard` encoder for better audio quality
* **Video**: Fixed frame rate at 20fps with controlled bitrate for stable performance
* **Resolution**: 640x480 resolution suitable for face swap processing

These resources provide complete examples of how to integrate Agora's real-time video communication SDK, which can be used as a reference for implementing the video streaming part of the live face swap functionality.


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