Text Protection Endpoint


METHOD: POST
ENDPOINT: https://dev.qupass.in/api/text

Description

The Text endpoint enables the protection and unprotection of arbitrary textual data, across all supported languages.

The returned token preserves the original character set across all supported languages, ensuring Unicode integrity and data stores’ locale compatibility.

Maintaining the same encoding space or range of symbols from which the original data was derived — for example, preserving that a tokenized name in Hindi still uses characters from the Devanagari Unicode block (U+0900–U+097F), or a name in English remains within the Latin-1 or Basic Latin Unicode blocks (U+0000–U+007F).

Example

  • Input: Lorem ipsum dolor sit amet (Latin)
    • QuFold_Token: Kc0TFa vC9nfU s7cRLB qdf20o dAPVXIAeoK
      • ✅ Character set preserved (Latin block)
      • ✅ Encoding compatibility is maintained
    • FPE_Token: 8j2Ev EG4KN GEgdB tNw H0sT
      • ✅ Length and Character set preserved (Latin block)
      • ✅ Encoding compatibility is maintained
  • Input: లోరమ్ ఇప్సమ్ డోలర్ సిట్ అమేట్ (Telugu)
    • QuFold_Token: సఫః౪ఝ౧ఊఢ్ ోబకంధత ైఉఊఄఘౙవసష ున౪ఀఢఎ౧ఌభ ఝుశఏఉశళఔతటగర
      • ✅ Character set preserved (Telugu block)
      • ✅ Encoding compatibility is maintained
  • Input: लोरेम इप्सम डोलर सिट अमेट (Devanagari)
    • QuFold_Token: ॲरनथगॵ झघॹंःड़ॠ अगॆऒै॰झ ॽट॥ऎॆॾॶ ङौऻज़ैॏऋैॴव
      • ✅ Character set preserved (Devanagari block)
      • ✅ Encoding compatibility is maintained It is not length-preserving — token length may vary intentionally to introduce structural entropy and strengthen protection against pattern correlation and reverse inference.


Request Payload


  • HEADER PARAMETERS
    • x-api-key (required) Provides access to one or more functions in the API Playground.
    • Authorization (required) The JWT token issued upon successful authentication.
    • qu-token (required) QU token that you revceive at the time of login.

  • PAYLOAD DETAILS
    • id (required) Integer identifier for the request.
    • operation (required) Specifies the protection operation. Available: [protect | unprotect].
    • data (required) Array of values to be transformed.
    • options:
      • method - Transformation method; Available: [tokenise | fpe | mask | redact | passthrough].
        • Defaults to tokenise
      • scope - User-defined context string; differentiates tokens across applications or datasets. (e.g., app1, azure+app1).
        • Defaults to no-scope
      • lang - Language domain of the input. Supports most of the International and Indic languages. Look for supported languages
        • International: [en | de | fr | es | it | ru | ar | si | th | hi | ja | ko | zh]
        • Indic: [hi | te | kn | ta | bn | pa | gu | or | ml ]
        • Defaults to en
      • noise - Adds controlled randomness.
        • Defaults to 0, ensures deterministic tokenization within scope
        • Non-zero values produce possible distinct tokens for the repeated inputs

Sample Request


  	curl --location 'https://dev.qupass.in/api/text' \
  	--header 'x-api-key: <API_Key>' \
  	--header 'Authorization: <JWT_TOKEN>' \
  	--header 'qu-token: <QU_TOKEN>' \
  	--header 'Content-Type: application/json' \
  	--data '{
  		"id": 1,
  		"operation": "protect",
  		"data": [
  			"Lorem ipsum dolor sit amet",
      		"Quick brown fox jumps over",
      		"Synthetic dataset element one"
  		],
  		"options": {
  			"method": "tokenise",
  			"scope": "App1"
  		}
  	}'
    package main

    import ( 
      "io" 
      "fmt"
      "strings" 
      "net/http" 
      )
      
    func main() { 
      API_Key := "<API_Key>"
      JWT_Token := "<JWT_TOKEN>"
      QU_Token := "<QU_TOKEN>"
      
      url := "https://dev.qupass.in/api/text"
      data := strings.NewReader(`{ 
          "id":1,
          "operation": "protect", 
          "data": [
            "Lorem ipsum dolor sit amet",
        	"Quick brown fox jumps over",
        	"Synthetic dataset element one"
          ],
          "options": {
            "method": "tokenise",
            "scope": "App1"
          } 
      }`)

      req, err := http.NewRequest("POST", url, data)
      if err != nil {
        fmt.Println(err)
        return
      }

      req.Header.Set("x-api-key", API_Key)
      req.Header.Set("Authorization", JWT_Token)
      req.Header.Set("qu-token", QU_Token)
      req.Header.Set("Content-Type", "application/json")

      client := &http.Client{}
      resp, err := client.Do(req)
      if err != nil {
        fmt.Println(err)
        return
      }
      defer resp.Body.Close()

      body, err := io.ReadAll(resp.Body)
      if err != nil {
        fmt.Println(err)
        return
      }

      fmt.Println(string(body))
    }
    import java.net.HttpURLConnection;
    import java.net.URI;
    import java.net.URL;
    import java.io.OutputStream;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;
    import java.nio.charset.StandardCharsets;

    public class APIRequest {
        public static void main(String[] args) {
            try {
                String API_Key = "<API_Key>";
                String JWT_Token = "<JWT_TOKEN>";
                String QU_Token = "<QU_TOKEN>";

                URI uri = new URI("https://dev.qupass.in/api/text");

                String data = "{"
                        + "\"id\": 1,"
                        + "\"operation\": \"protect\","
                        + "\"data\": ["
                        + "\"Lorem ipsum dolor sit amet\","
                        + "\"Quick brown fox jumps over\","
                        + "\"Synthetic dataset element one\""
                        + "],"
                        + "\"options\": {"
                        + "\"method\": \"tokenise\","
                        + "\"scope\": \"App1\""
                        + "}"
                        + "}";

                URL url = uri.toURL();
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setRequestMethod("POST");
                conn.setRequestProperty("x-api-key", API_Key);
                conn.setRequestProperty("Authorization", JWT_Token);
                conn.setRequestProperty("qu-token", QU_Token);
                conn.setRequestProperty("Content-Type", "application/json");
                conn.setDoOutput(true);

                // Send request body
                try (OutputStream os = conn.getOutputStream()) {
                    byte[] input = data.getBytes(StandardCharsets.UTF_8);
                    os.write(input, 0, input.length);
                }

                int statusCode = conn.getResponseCode();

                BufferedReader br;
                if (statusCode >= 200 && statusCode < 300) {
                    br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
                } else {
                    br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8));
                }

                StringBuilder response = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    response.append(line.trim());
                }

                System.out.println(response.toString());

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    const API_Key = "<API_Key>";
    const JWT_Token = "<JWT_TOKEN>";
    const QU_Token = "<QU_TOKEN>";

    const url = "https://dev.qupass.in/api/text";

    const data = {
      id: 1,
      operation: "protect",
      data: [
        "Lorem ipsum dolor sit amet",
        "Quick brown fox jumps over",
        "Synthetic dataset element one"
      ],
      options: {
        method: "tokenise",
        scope: "App1"
      }
    };

    fetch(url, {
      method: "POST",
      headers: {
        "x-api-key": API_Key,
        "Authorization": JWT_Token,
        "qu-token": QU_Token,
        "Content-Type": "application/json"
      },
      body: JSON.stringify(data)
    })
      .then(async (response) => {
        const text = await response.text(); // raw response like Python's response.text
        if (!response.ok) {
          throw new Error(`HTTP ${response.status}: ${text}`);
        }
        console.log(text);
      })
      .catch((error) => {
        console.error("Error:", error.message);
      });
    <?php

    $API_Key = "<API_Key>";
    $JWT_Token = "<JWT_TOKEN>";
    $QU_Token = "<QU_TOKEN>";

    $url = "https://dev.qupass.in/api/text";

    $headers = [
        "x-api-key: $API_Key",
        "Authorization: $JWT_Token",
        "qu-token: $QU_Token",
        "Content-Type: application/json"
    ];

    $data = [
        "id" => 1,
        "operation" => "protect",
        "data" => [
            "Lorem ipsum dolor sit amet",
        	"Quick brown fox jumps over",
        	"Synthetic dataset element one"
        ],
        "options" => [
            "method" => "tokenise",
            "scope" => "App1"
        ]
    ];

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    } else {
        echo $response;
    }

    curl_close($ch);
    ?>
    import requests
    import json

    API_Key = "<API_Key>"
    JWT_Token = "<JWT_TOKEN>"
    QU_Token = "<QU_TOKEN>"

    url = 'https://dev.qupass.in/api/text'
    headers = {
      'x-api-key': API_Key,
      'Authorization': JWT_Token,
      'qu-token': QU_Token,
      'Content-Type': 'application/json'
    }

    data = {
      "id": 1,
      "operation": "protect",
      "data": [
        "Lorem ipsum dolor sit amet",
        "Quick brown fox jumps over",
        "Synthetic dataset element one"
      ],
      "options": {
        "method": "tokenise",
        "scope": "App1"
      }
    }

    response = requests.post(url, headers=headers, data=json.dumps(data))
    print(response.text)


Sample Data Payload and Output


PROTECTION SCENARIOS:

InputOutput
  {
    "operation": "protect",
    "data": [
        "Lorem ipsum dolor sit amet",
        "Lorem ipsum dolor sit amet",
      "Quick brown fox jumps over",
      "Synthetic dataset element one"
    ],
    "method": "*" // [tokenise, fpe, .,]
  }
    {
      "operation": "protect",  
      "result": [
          "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
          "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
          "WJ7zV2 tfAKju n8KEcA HMKuzX MZNOaNxtw",
          "yueZsqYHp 8dJAbubZM 1tYxocfta TPsbcgqFGcG"
      ],
      "method": "tokenise"
    }
    {
      "operation": "protect",  
      "result": [
          "vw0wxL ZyVnI9 URLETQ MknPHA 7cAYKgMIdd",
          "vw0wxL ZyVnI9 URLETQ MknPHA 7cAYKgMIdd",
          "cwsfP4p LAwtT91 ACKUg2G Lv3VG6w bxfREXdk",
          "ieMsF70gmt MvnNDp9ukP fsmiWawuIh sz1M7XycFYl"
      ],
      "method": "tokenise",
      "scope": "App1" //SCOPE
    }
    {
      "operation": "protect",  
      "result": [
          "4sosUK MdmWb9 zQyIve HqZM37 jzmbATrM",
          "Xw1W2W jFiV9S 6grIIg 4Hk0Wj FkGV8Nkj",
          "2l3NQP WIsWS0 whNeYR sqaWQf Dr6xbfkZfq",
          "ST9Q8gjQ3 i1ZGpCLQp kMqS0qvI3 FIWwLXfTX6Cl"
      ],
      "method": "tokenise",
      "noise": "2" //NOISE
    }
    {
      "operation": "protect",  
      "result": [
          "nr7as0 apSOZ6 kxi5LR XqHOO3 8Mp8QunfRv",
          "wvUMjR QFcz2u wK9DAT avcp94 sxc3owOwT1",
          "up3J9o5 b7z1Oer fDgjLmX JQqeGvR 6sGQxT9Y",
          "iAhfFXhHEO XiMd53ZRhd V8J4Sr9NyU qSer5S5XpNw"
      ],
      "method": "tokenise",
      "scope": "App1", //SCOPE
      "noise": "2" //NOISE
    }
    {
      "operation": "protect",  
      "result": [
          "8j2Ev EG4KN GEgdB tNw H0sT",
          "8j2Ev EG4KN GEgdB tNw H0sT",
          "GwoWh 5DTt8 mcx itGUh FrYL",
          "fLn9jNTSq CwF6pOA nbFHAmF kqX"
      ],
      "method": "fpe" // FPE
    }

UNPROTECTION SCENARIOS:

InputOutput
  {
    "operation": "unprotect",
    "data": [
        "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
        "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
        "WJ7zV2 tfAKju n8KEcA HMKuzX MZNOaNxtw",
        "yueZsqYHp 8dJAbubZM 1tYxocfta TPsbcgqFGcG"
    ],
    "method": "tokenise"
  }
    {
      "operation": "unprotect",  
      "result": [
          "Lorem ipsum dolor sit amet",
          "Lorem ipsum dolor sit amet",
          "Quick brown fox jumps over",
          "Synthetic dataset element one"
      ]
    }
  {
    "operation": "unprotect",
    "data": [
        "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
        "LX9oXI Qaq2av Yn0jD yNtgfc JARenJw",
        "WJ7zV2 tfAKju n8KEcA HMKuzX MZNOaNxtw",
        "yueZsqYHp 8dJAbubZM 1tYxocfta TPsbcgqFGcG"
    ],
    "method": "tokenise"
  }
    {
      "operation": "unprotect",  
      "result": [
          "Lorem ipsum dolor sit amet",
          "LX9oXI Qaq2av Yn0jD yNtgfc JARenJw", //INVALID
          "Quick brown fox jumps over",
          "Synthetic dataset element one"
      ],
      "discrepancy": {
        "invalid_token": [ //INVALID
          1 // INDEX
        ]
      }
    }
  {
    "operation": "unprotect",
    "data": [
        "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
        "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
        "WJ7zV2 tfAKju n8KEcA HMKuzX MZNOaNxtw",
        "yueZsqYHp 8dJAbubZM 1tYxocfta TPsbcgqFGcG"
    ],
    "scope":"App2", //INVALID
    "method": "tokenise"
  }
    {
      "operation": "unprotect",  
      "result": [
          "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
          "LX9oXI Qaq2av MYn0jD yNtgfc JARenJw",
          "WJ7zV2 tfAKju n8KEcA HMKuzX MZNOaNxtw",
          "yueZsqYHp 8dJAbubZM 1tYxocfta TPsbcgqFGcG"
      ],
      "discrepancy": {
        "invalid_scope": [ // INVALID
          0, // INDEX
          1,
          2,
          3
        ]
      }
    }
  {
    "operation": "unprotect",
    "data": [
        "8j2Ev EG4KN GEgdB tNw H0sT",
        "8j2Ev EG4KN GEgdB tNw H0sT",
        "GwoWh 5DTt8 mcx itGUh FrYL",
        "fLn9jNTSq CwF6pOA nbFHAmF kqX"
    ],
    "method": "fpe"
  }
    {
      "operation": "unprotect",  
      "result": [
          "Lorem ipsum dolor sit amet",
          "Lorem ipsum dolor sit amet",
          "Quick brown fox jumps over",
          "Synthetic dataset element one"
      ]
    }