InsightFaceSwap /changebg command

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Model
  5. Examples
  6. Try It

Use this endpoint to submit the InsightFaceSwap /changebg command to your InsightFaceSwap Discord channel. Results obtained as a callback via optional parameter replyUrl or by querying faceswap/jobs/?jobid=jobid endpoint.

It is important not to use the InsightFaceSwap account setup for API access for any purposes other than its intended use, such as executing /changebg or any other InsightFaceSwap commands manually or in conjunction with any other automation tools. The API internally tracks the usage of the InsightFaceSwap account, including the number of currently active executions. Using it for other activities may cause API to function incorrectly.

Request Headers
Authorization: Bearer {API token}
Content-Type: multipart/form-data
Request Body
    "channel": "Discord channel id",
    "a_background_photo_of": "Background prompt",
    "image": "Image File or Blob",
    "replyUrl": "Place your call back URL here",
    "replyRef": "Place your reference id here"
  • channel is optional, if omitted a randomly selected configured channel with available credits will be used.

  • a_background_photo_of is required, background prompt, please refer to InsightFaceSwap /changebg for details.

  • image is required, source image. Must be either a File or Blob object when included in this FormData POST request.

  • replyUrl is optional, if not provided value from account will be used.
    Place here your callback URL. API will call the provided replyUrl once job completed or failed.
    Maximum length 1024 characters.
    We recommend using sites like to test callback URL functionality.

  • replyRef is optional, place here your reference id which will be stored and returned along with this job response / result.
    Maximum length 1024 characters.

  • 200 OK

    Use returned jobid to retrieve InsightFaceSwap job status and results or use callback replyUrl.

    Field content contains message generated by InsightFaceSwap.

        "jobid": "<jobid>",
        "verb": "faceswap-changebg",
        "status": "started",
        "a_background_photo_of": "sunny beach",
        "image": { "size": 1699405, "type": "image/png" },
        "created": "2023-09-09T02:04:49.667Z",
        "updated": "2023-09-09T02:04:53.490Z",
        "discord": "<ABC…secured…xyz>",
        "server": "<Discord server id>",
        "channel": "<Discord channel id>",
        "replyUrl": "",
        "replyRef": "<your optional reference id>",
        "messageId": "<Discord message id>",
        "content": "<@Discord user id> Picsi.Ai ChangeBG Job Submitted [jobid: 8a1f574fdbf79e8cd57e070476d9d5f3] [credits: 4] [prompt: 'sunny beach'] [time: <time>] [SaveID: '_'] (796/800 credits remaining)",
        "timestamp": "2023-09-09T02:04:51.926000+00:00",
        "code": 200
  • 400 Bad Request

          "Required param a_background_photo_of is missing or empty"
          "Required param image is missing or empty"
          "Param image is not File or Blob"
          "Optional param replyRef is too long"
          "Optional param replyUrl is too long"
          "Configuration not found for channel <channel>, to create POST v1/faceswap/account/<channel>"
        "code": 400
  • 401 Unauthorized

        "error": "Unauthorized",
        "code": 401
  • 402 Payment Required

        "error": "Account has no subscription or subscription expired",
        "code": 402
  • 429 Too Many Requests

    Wait in a loop for at least 10..30 seconds and retry again.

    There are two possible cases for API response 429.

    1. API query is full and can not accept new faceswap/changebg requests.
       "error": "Unable to lock Discord after <attempts> attempts",
       "code": 429
    2. The API received an HTTP status 429 from the Discord API when it attempted to POST to the /interactions endpoint. Under normal circumstances, this should be a rare occurrence because the API is designed to strictly adhere to Discord rate limits. However, in certain scenarios, Discord may still issue a 429 response.
       "error": "Discord /interactions failed with HTTP status 429",
       "errorDetails": "{\"global\":true,\"message\":\"You are being rate limited.\",\"retry_after\":10}",
       "code": 429
{ // TypeScript, all fields are optional
  jobid: string, 
  verb: 'faceswap-changebg',
  status: 'started' | 'failed',
  a_background_photo_of: string,
  image: { size: number, type: string },
  created: string, // YYYY-MM-DDTHH:mm:ss.sssZ, IS0 8601, UTC
  updated: string, // YYYY-MM-DDTHH:mm:ss.sssZ, IS0 8601, UTC
  discord: string, // Provided for debugging purposes only, contains the first 3 and the last 3 characters of the original value
  server: string,
  channel: string,
  replyUrl: string,
  replyRef: string,
  messageId: string,
  content: string, // Contains message generated by InsightFaceSwap 
  timestamp: string,
  error: string,
  errorDetails: string,
  code: number
  • curl -H "Accept: application/json" \
         -H "Authorization: Bearer …" \
         -X POST \
         -F "channel=<Discord channel id>" \
         -F 'image=@"<Path to the image>"' \
         -F "a_background_photo_of=<a_background_photo_of>" 
  • const main = async () => {
        const apiUrl = "";
        const token = "API token";
        const a_background_photo_of = "a_background_photo_of";
        const channel = "Discord channel";
        const data = {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${token}`
        const formData = new FormData();
        formData.append("a_background_photo_of", a_background_photo_of);
        formData.append("channel", channel);
            // Example 1: Fetch image from URL
            const imageUrl = "";
            const responseImage = await fetch(imageUrl);
            formData.append("image", await responseImage.blob());
            // Example 2: Load image from local file (Blob)
            const fsp = require('fs').promises;
            const imageFileName = "./target_photo.png";
            const blob = new Blob([await fsp.readFile(imageFileName)]);
            formData.append("image", blob);
            // Example 3: Load from input file html element
            // <input id="target-photo-image-file" type="file"> 
            const imageFile = document.getElementById(`target-photo-image-file`);
            if (imageFile.files[0])
                formData.append("image", imageFile.files[0]);
        data.body = formData;
        const response = await fetch(apiUrl, data);
        const result = await response.json();
        console.log("response", { response, result });
  • import requests
    api_url = ""
    token = "API token"
    a_background_photo_of = "a_background_photo_of"
    channel = "Discord channel"
    headers = {
        'Authorization': f'Bearer {token}'
    files = {
        'a_background_photo_of': (None, a_background_photo_of),
        'channel': (None, channel)
    # # Example 1: Fetch image from URL
    # image_url = ""
    # response_image = requests.get(image_url)
    # image_content = response_image.content
    # files['image'] = ('image.jpg', image_content, 'image/jpeg')
    # # Example 2: Load image from local file
    # image_file_path = "./target_photo.png"
    # with open(image_file_path, 'rb') as image_file:
    #     files['image'] = ('target_photo.png',, 'image/png')
    response =, headers=headers, files=files)
    print(response, response.json())
Try It