Exemplo da API CPF com NodeJS

NodeJS

Aprenda a integrar a API CPF do SintegraWS com NodeJS utilizando exemplos de código práticos.

Valide CPFs em tempo real em seu sistema de forma rápida e eficiente. Siga o exemplo abaixo para implementar a API CPF com NodeJS no seu ambiente de desenvolvimento e aprimorar a confiabilidade do seu sistema.

  (async () => {
    // Aqui você define os valores do token, CPF e data de nascimento:
    // Este código assume Node.js 18+ com fetch e AbortController nativos
    const token = 'SEU_TOKEN_AQUI';
    const cpf = '12345678901';
    const dataNascimento = '03061988';
  
    // Validando o CPF antes de proceder
    if (!isValidCPF(cpf)) {
      console.error("CPF inválido!");
      return;
    }
  
    // Montando a URL com parâmetros codificados
    const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
  
    // Criar AbortController para implementar o timeout manualmente
    const controller = new AbortController();
    const signal = controller.signal;
  
    // Timeout de 120 segundos
    const timeout = setTimeout(() => {
      controller.abort();
    }, 120000);
  
    try {
      const response = await fetch(url, { signal });
      if (!response.ok) {
        throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
      }
  
      const data = await response.json();
      if (data.status === "OK") {
        console.log("Status está OK!");
      } else {
        console.log("Status não está OK ou não encontrado.");
      }
    } catch (error) {
      console.error('Erro ao chamar a API:', error);
    } finally {
      clearTimeout(timeout);
    }
  })();
  
  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  function isValidCPF(cpf) {
    cpf = cpf.replace(/[^\d]+/g, '');
    if (cpf.length !== 11) return false;
    if (/^(.)\1+$/.test(cpf)) return false;
  
    let add = 0;
    for (let i = 0; i < 9; i++) {
      add += parseInt(cpf.charAt(i)) * (10 - i);
    }
    let rev = 11 - (add % 11);
    rev = (rev > 9) ? 0 : rev;
    if (rev !== parseInt(cpf.charAt(9))) return false;
  
    add = 0;
    for (let i = 0; i < 10; i++) {
      add += parseInt(cpf.charAt(i)) * (11 - i);
    }
    rev = 11 - (add % 11);
    rev = (rev > 9) ? 0 : rev;
    return (rev === parseInt(cpf.charAt(10)));
  }
  (async () => {
    // Aqui você define os valores do token, CPF e data de nascimento:
    const token = 'SEU_TOKEN_AQUI';
    const cpf = '12345678901'; // Exemplo de CPF sem pontuação
    const dataNascimento = '03061988'; // Ajuste o formato conforme a API exige
  
    // Antes de tudo, validar o CPF
    if (!isValidCPF(cpf)) {
      console.error("CPF inválido!");
      return;
    }
  
    // Montando a URL com os parâmetros codificados para evitar problemas com caracteres especiais
    const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
  
    // Criamos um AbortController para permitir cancelar a requisição, caso atinja o timeout
    const controller = new AbortController();
    const signal = controller.signal;
  
    // Definimos um timeout de 120 segundos (120.000 milissegundos).
    // Se a requisição não responder nesse tempo, abortamos.
    const timeout = setTimeout(() => {
      controller.abort();
    }, 120000);
  
    try {
      // Fazendo a requisição GET usando fetch e aguardando a resposta.
      // Passamos o 'signal' do AbortController para poder abortar se necessário.
      const response = await fetch(url, { signal });
  
      // Verificando se o status da resposta é OK (200)
      if (!response.ok) {
        // Se não for, lançamos um erro para cair no bloco catch
        throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
      }
  
      // Convertendo a resposta para JSON
      const data = await response.json();
  
      // Aqui você pode manipular os dados retornados da API.
      // Vamos apenas verificar se o campo "status" é "OK"
      if (data.status === "OK") {
        console.log("Status está OK!");
      } else {
        console.log("Status não está OK ou não encontrado.");
      }
    } catch (error) {
      // Tratando qualquer erro que possa ocorrer durante a requisição ou o processamento,
      // incluindo o erro de timeout (AbortError) ou problemas de rede.
      console.error('Erro ao chamar a API:', error);
    } finally {
      // Limpamos o timeout, garantindo que não fique pendente após o término da operação.
      clearTimeout(timeout);
    }
  })();
  
  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  function isValidCPF(cpf) {
    // Remove todos os caracteres não-numéricos
    cpf = cpf.replace(/[^\d]+/g, '');
    // Verifica se tem 11 dígitos
    if (cpf.length !== 11) return false;
    // Verifica se todos os dígitos são iguais
    if (/^(.)\1+$/.test(cpf)) return false;
  
    let add = 0;
    for (let i = 0; i < 9; i++) {
      add += parseInt(cpf.charAt(i)) * (10 - i);
    }
    let rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    if (rev !== parseInt(cpf.charAt(9))) return false;
  
    add = 0;
    for (let i = 0; i < 10; i++) {
      add += parseInt(cpf.charAt(i)) * (11 - i);
    }
    rev = 11 - (add % 11);
    rev = (rev === 10 || rev === 11) ? 0 : rev;
    return (rev === parseInt(cpf.charAt(10)));
  }
  package main
  
  import (
    "context"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "time"
  )
  
  func main() {
    // Definir valores de token, CPF e data de nascimento
    token := "SEU_TOKEN_AQUI"
    cpf := "12345678901"
    dataNascimento := "03061988"
  
    // Validar CPF
    if !isValidCPF(cpf) {
      fmt.Println("CPF inválido!")
      return
    }
  
    // Construir a URL com parâmetros
    baseURL := "https://www.sintegraws.com.br/api/v1/execute-api.php"
    params := url.Values{}
    params.Set("token", token)
    params.Set("cpf", cpf)
    params.Set("data-nascimento", dataNascimento)
    params.Set("plugin", "CPF")
  
    finalURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())
  
    // Contexto com timeout de 120s
    ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
    defer cancel()
  
    req, err := http.NewRequestWithContext(ctx, "GET", finalURL, nil)
    if err != nil {
      fmt.Println("Erro ao criar a requisição:", err)
      return
    }
  
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
      fmt.Println("Erro ao chamar a API:", err)
      return
    }
    defer resp.Body.Close()
  
    if resp.StatusCode != http.StatusOK {
      fmt.Printf("Erro na requisição: %d\n", resp.StatusCode)
      return
    }
  
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
      fmt.Println("Erro ao ler a resposta:", err)
      return
    }
  
    var result map[string]interface{}
    if err := json.Unmarshal(body, &result); err != nil {
      fmt.Println("Erro ao decodificar JSON:", err)
      return
    }
  
    if status, ok := result["status"].(string); ok && status == "OK" {
      fmt.Println("Status está OK!")
    } else {
      fmt.Println("Status não está OK ou não encontrado.")
    }
  }
  
  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  func isValidCPF(cpf string) bool {
    var digits []rune
    for _, c := range cpf {
      if c >= '0' && c <= '9' {
        digits = append(digits, c)
      }
    }
    if len(digits) != 11 {
      return false
    }
  
    allSame := true
    for i := 1; i < 11; i++ {
      if digits[i] != digits[0] {
        allSame = false
        break
      }
    }
    if allSame {
      return false
    }
  
    sum := 0
    for i := 0; i < 9; i++ {
      sum += int(digits[i]-'0') * (10 - i)
    }
    rest := 11 - (sum % 11)
    if rest == 10 || rest == 11 {
      rest = 0
    }
    if rest != int(digits[9]-'0') {
      return false
    }
  
    sum = 0
    for i := 0; i < 10; i++ {
      sum += int(digits[i]-'0') * (11 - i)
    }
    rest = 11 - (sum % 11)
    if rest == 10 || rest == 11 {
      rest = 0
    }
    return rest == int(digits[10]-'0')
  }
  // Aqui você define os valores do token, CPF e data de nascimento:
  $token = "SEU_TOKEN_AQUI";
  $cpf = "12345678901";
  $dataNascimento = "03061988";

  // Validar CPF antes de prosseguir
  if (!isValidCPF($cpf)) {
    echo "CPF inválido!";
    exit;
  }

  // Montar a URL com parâmetros codificados
  $baseURL = "https://www.sintegraws.com.br/api/v1/execute-api.php";
  $params = [
    "token" => $token,
    "cpf" => $cpf,
    "data-nascimento" => $dataNascimento,
    "plugin" => "CPF",
  ];

  // URL final
  $url = $baseURL . "?" . http_build_query($params);

  // Iniciar cURL e definir timeout de 120 segundos
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_TIMEOUT, 120);

  // Executar a requisição
  $response = curl_exec($ch);

  // Verificar se ocorreu algum erro no cURL
  if (curl_errno($ch)) {
    $error = curl_error($ch);
    curl_close($ch);
    echo "Erro ao chamar a API: " . $error;
    exit;
  }

  // Verificar o código de status HTTP
  $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);

  if ($httpCode !== 200) {
    echo "Erro na requisição: $httpCode\n";
    exit;
  }

  // Converter resposta para JSON
  $data = json_decode($response, true);

  if (json_last_error() !== JSON_ERROR_NONE) {
    echo "Erro ao decodificar JSON: " . json_last_error_msg();
    exit;
  }

  // Verificar se o campo "status" é "OK"
  if (isset($data["status"]) && $data["status"] === "OK") {
    echo "Status está OK!\n";
  } else {
    echo "Status não está OK ou não encontrado.\n";
  }

  // Função para validar CPF em PHP
  // Remove não dígitos, verifica se não é uma sequência repetida
  // e calcula os dígitos verificadores conforme a regra do CPF.
  function isValidCPF($cpf) {
    $cpf = preg_replace('/\D/', '', $cpf);
    if (strlen($cpf) != 11) return false;
    if (preg_match('/(\d)\1{10}/', $cpf)) return false;

    for ($t = 9; $t < 11; $t++) {
        $d = 0;
        for ($c = 0; $c < $t; $c++) {
            $d += $cpf[$c] * (($t + 1) - $c);
        }
        $d = 11 - ($d % 11);
        $d = ($d > 9) ? 0 : $d;
        if ($cpf[$t] != $d) return false;
    }
    return true;
  }
  import requests

  # Definir valores de token, CPF e data de nascimento
  token = "SEU_TOKEN_AQUI"
  cpf = "12345678901"
  data_nascimento = "03061988"

  # Validar CPF antes de prosseguir
  if not isValidCPF(cpf):
    print("CPF inválido!")
    exit()

  # Montar a URL e os parâmetros
  url = "https://www.sintegraws.com.br/api/v1/execute-api.php"
  params = {
    "token": token,
    "cpf": cpf,
    "data-nascimento": data_nascimento,
    "plugin": "CPF"
  }

  try:
    # Fazer a requisição GET com timeout de 120 segundos
    response = requests.get(url, params=params, timeout=120)
    
    # Verificar se o status code é 200 (OK)
    response.raise_for_status()
    
    # Converter resposta para JSON
    data = response.json()

    # Verificar se o campo "status" é "OK"
    if data.get("status") == "OK":
      print("Status está OK!")
    else:
      print("Status não está OK ou não encontrado.")

  except requests.exceptions.RequestException as e:
    # Tratar erros de conexão, timeout e HTTP
    print(f"Erro ao chamar a API: {e}")
  except ValueError as e:
    # Tratar erros ao decodificar JSON
    print(f"Erro ao decodificar JSON: {e}")

  def isValidCPF(cpf: str) -> bool:
    # Remove caracteres não numéricos
    # Verifica se possui 11 dígitos
    # Verifica se não é uma sequência de dígitos iguais
    # Calcula os dígitos verificadores conforme a regra do CPF
    cpf = ''.join([c for c in cpf if c.isdigit()])
    if len(cpf) != 11:
        return False
    if cpf == cpf[0]*11:
        return False

    def calc_digit(digs, pos):
        s = sum(int(d) * (pos - i) for i, d in enumerate(digs))
        r = 11 - (s % 11)
        return '0' if r > 9 else str(r)

    d1 = calc_digit(cpf[:9], 10)
    d2 = calc_digit(cpf[:10], 11)
    return cpf[-2:] == d1 + d2
  using System;
  using System.Net.Http;
  using System.Threading.Tasks;
  using System.Web;
  using System.Text.Json;
  using System.Linq;
  using System.Collections.Generic;

  class Program
  {
    static async Task Main(string[] args)
    {
      // Valores de exemplo para token, CPF e data de nascimento
      string token = "SEU_TOKEN_AQUI";
      string cpf = "12345678901";
      string dataNascimento = "03061988";

      // Validar CPF antes de prosseguir
      if (!IsValidCPF(cpf))
      {
          Console.WriteLine("CPF inválido!");
          return;
      }

      // Construir a URL com parâmetros codificados
      var baseUrl = "https://www.sintegraws.com.br/api/v1/execute-api.php";
      var builder = new UriBuilder(baseUrl);
      var query = HttpUtility.ParseQueryString(string.Empty);
      query["token"] = token;
      query["cpf"] = cpf;
      query["data-nascimento"] = dataNascimento;
      query["plugin"] = "CPF";
      builder.Query = query.ToString();

      // Criar um HttpClient com timeout de 120 segundos
      using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(120) };

      try
      {
        // Fazer a requisição GET
        var response = await httpClient.GetAsync(builder.Uri);

        // Verificar se o status code é 200 (OK)
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine($"Erro na requisição: {(int)response.StatusCode} {response.ReasonPhrase}");
            return;
        }

        // Ler o corpo da resposta como string
        var responseBody = await response.Content.ReadAsStringAsync();

        // Decodificar JSON
        var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
        var data = JsonSerializer.Deserialize>(responseBody, options);

        // Verificar o campo "status" no JSON
        if (data != null && data.TryGetValue("status", out var statusValue) && statusValue is string status && status == "OK")
        {
            Console.WriteLine("Status está OK!");
        }
        else
        {
            Console.WriteLine("Status não está OK ou não encontrado.");
        }
      }
      catch (TaskCanceledException)
      {
        // Caso o timeout seja excedido
        Console.WriteLine("A requisição excedeu o tempo limite (120 segundos).");
      }
      catch (Exception e)
      {
        Console.WriteLine($"Erro ao chamar a API: {e.Message}");
      }
    }

    // Função para validar CPF em C#
    // Remove caracteres não numéricos, verifica se não é uma sequência de dígitos iguais
    // e calcula os dígitos verificadores conforme a regra do CPF.
    static bool IsValidCPF(string cpf)
    {
      cpf = new string(cpf.Where(char.IsDigit).ToArray());
      if (cpf.Length != 11) return false;
      if (cpf.All(c => c == cpf[0])) return false;

      int[] mult1 = {10,9,8,7,6,5,4,3,2};
      int[] mult2 = {11,10,9,8,7,6,5,4,3,2};

      string tempCpf = cpf.Substring(0,9);
      int sum = 0;
      for (int i = 0; i < 9; i++)
          sum += (tempCpf[i] - '0') * mult1[i];

      int rest = 11 - (sum % 11);
      rest = (rest == 10 || rest == 11) ? 0 : rest;
      if (rest != (cpf[9]-'0')) return false;

      tempCpf = cpf.Substring(0,10);
      sum = 0;
      for (int i = 0; i < 10; i++)
          sum += (tempCpf[i] - '0') * mult2[i];

      rest = 11 - (sum % 11);
      rest = (rest == 10 || rest == 11) ? 0 : rest;
      return rest == (cpf[10]-'0');
    }
  }
  import java.io.IOException;
  import java.net.URI;
  import java.net.URLEncoder;
  import java.net.http.*;
  import java.net.http.HttpResponse.BodyHandlers;
  import java.nio.charset.StandardCharsets;
  import java.time.Duration;
  import java.util.Map;
  import com.fasterxml.jackson.databind.ObjectMapper;

  public class ApiExample 
  {
    public static void main(String[] args) 
    {
      // Valores de exemplo para token, CPF e data de nascimento
      // Ajuste conforme a API exige
      String token = "SEU_TOKEN_AQUI";
      String cpf = "12345678901";
      String dataNascimento = "03061988";

      // Validar CPF antes de prosseguir
      if (!isValidCPF(cpf)) {
          System.out.println("CPF inválido!");
          return;
      }

      // Montar a URL com parâmetros codificados
      String baseUrl = "https://www.sintegraws.com.br/api/v1/execute-api.php";
      String url = baseUrl
              + "?token=" + URLEncoder.encode(token, StandardCharsets.UTF_8)
              + "&cpf=" + URLEncoder.encode(cpf, StandardCharsets.UTF_8)
              + "&data-nascimento=" + URLEncoder.encode(dataNascimento, StandardCharsets.UTF_8)
              + "&plugin=CPF";

      // Criar o HttpClient com timeout de 120 segundos
      HttpClient client = HttpClient.newBuilder()
              .connectTimeout(Duration.ofSeconds(120))
              .build();

      // Criar a requisição GET com timeout de 120 segundos
      HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create(url))
              .timeout(Duration.ofSeconds(120))
              .GET()
              .build();

      try {
          // Executar a requisição
          HttpResponse response = client.send(request, BodyHandlers.ofString());

          // Verificar se o status HTTP é 200 (OK)
          if (response.statusCode() != 200) {
              System.err.println("Erro na requisição: " + response.statusCode() + " " + response.body());
              return;
          }

          // Decodificar a resposta JSON
          ObjectMapper objectMapper = new ObjectMapper();
          Map data = objectMapper.readValue(response.body(), Map.class);

          // Verificar o campo "status"
          Object statusValue = data.get("status");
          if (statusValue instanceof String && "OK".equals(statusValue)) {
              System.out.println("Status está OK!");
          } else {
              System.out.println("Status não está OK ou não encontrado.");
          }
      } catch (HttpTimeoutException e) {
          // Caso a requisição ultrapasse o tempo limite
          System.err.println("A requisição excedeu o tempo limite de 120 segundos.");
      } catch (IOException | InterruptedException e) {
          // Tratar outros erros (rede, parsing, etc.)
          System.err.println("Erro ao chamar a API: " + e.getMessage());
      }
    }

    // Função para validar CPF em Java
    // Remove não dígitos, verifica se não é uma sequência repetida,
    // e calcula dígitos verificadores conforme a regra do CPF.
    public static boolean isValidCPF(String cpf) 
    {
      cpf = cpf.replaceAll("\\D", "");
      if (cpf.length() != 11) return false;
      if (cpf.chars().allMatch(ch -> ch == cpf.charAt(0))) return false;

      try {
          int sum = 0;
          for (int i = 0; i < 9; i++) {
              sum += (cpf.charAt(i) - '0') * (10 - i);
          }
          int rest = 11 - (sum % 11);
          rest = (rest == 10 || rest == 11) ? 0 : rest;
          if (rest != (cpf.charAt(9)-'0')) return false;

          sum = 0;
          for (int i = 0; i < 10; i++) {
              sum += (cpf.charAt(i) - '0') * (11 - i);
          }
          rest = 11 - (sum % 11);
          rest = (rest == 10 || rest == 11) ? 0 : rest;
          return rest == (cpf.charAt(10)-'0');
      } catch (Exception e) {
          return false;
      }
    }
  }
  import Foundation
  
  // Aqui você define os valores do token, CPF e data de nascimento:
  let token = "SEU_TOKEN_AQUI"
  let cpf = "12345678901"
  let dataNascimento = "03061988"
  
  guard isValidCPF(cpf) else {
    print("CPF inválido!")
    exit(1)
  }
  
  var components = URLComponents(string: "https://www.sintegraws.com.br/api/v1/execute-api.php")!
  components.queryItems = [
    URLQueryItem(name: "token", value: token),
    URLQueryItem(name: "cpf", value: cpf),
    URLQueryItem(name: "data-nascimento", value: dataNascimento),
    URLQueryItem(name: "plugin", value: "CPF")
  ]
  
  guard let finalURL = components.url else {
    print("Não foi possível construir a URL final.")
    exit(1)
  }
  
  let config = URLSessionConfiguration.default
  config.timeoutIntervalForRequest = 120
  let session = URLSession(configuration: config)
  
  let task = session.dataTask(with: finalURL) { data, response, error in
    if let error = error {
      print("Erro ao chamar a API:", error.localizedDescription)
      return
    }

    guard let httpResponse = response as? HTTPURLResponse else {
      print("Resposta inválida.")
      return
    }

    guard httpResponse.statusCode == 200 else {
      print("Erro na requisição: \(httpResponse.statusCode)")
      return
    }

    guard let data = data else {
      print("Resposta sem dados.")
      return
    }

    do {
      if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
          if let status = json["status"] as? String, status == "OK" {
            print("Status está OK!")
          } else {
            print("Status não está OK ou não encontrado.")
          }
      } else {
        print("Formato de JSON inválido.")
      }
    } catch {
      print("Erro ao decodificar JSON:", error.localizedDescription)
    }
  }
  task.resume()
  
  // Essa função é utilizada para validar o CPF antes de realizar a chamada na API
  func isValidCPF(_ cpf: String) -> Bool {
    let digits = cpf.filter { $0.isNumber }
    if digits.count != 11 { return false }
    if Set(digits).count == 1 { return false }

    func calcDigit(_ str: String, _ factor: Int) -> Int {
        var sum = 0
        for (i, char) in str.enumerated() {
            let val = Int(String(char))!
            sum += val * (factor - i)
        }
        let rest = 11 - (sum % 11)
        return (rest > 9) ? 0 : rest
    }

    let d1 = calcDigit(String(digits.prefix(9)), 10)
    if d1 != Int(String(digits[9]))! { return false }

    let d2 = calcDigit(String(digits.prefix(10)), 11)
    if d2 != Int(String(digits[10]))! { return false }

    return true
  }
  #Include "protheus.ch"
  
  User Function ChamarAPI()
    // Aqui você define os valores do token, CPF e data de nascimento
    Local cToken         := "SEU_TOKEN_AQUI"
    Local cCPF           := "12345678901"
    Local cDataNascimento:= "03061988"
    Local cBaseURL       := "https://www.sintegraws.com.br/api/v1/execute-api.php"
    Local cURL, cResp    := ""
    Local nStatus        := 0
    Local oJson

    If !IsValidCPF(cCPF)
      Conout("CPF inválido!")
      Return
    EndIf

    cURL := cBaseURL + ;
    "?token="           + URLEncode(cToken) + ;
    "&cpf="             + URLEncode(cCPF) + ;
    "&data-nascimento=" + URLEncode(cDataNascimento) + ;
    "&plugin=CPF"

    HttpSetTimeOut(120000)
    cResp := HttpGet(cURL)
    nStatus := HttpResult()

    If nStatus <> 200
      Conout("Erro na requisição: " + Ltrim(Str(nStatus)))
      Return
    EndIf

    If Empty(cResp)
      Conout("Resposta vazia.")
      Return
    EndIf

    oJson := JsonDecode(cResp)
    If oJson == Nil
      Conout("Erro ao decodificar JSON.")
      Return
    EndIf

    If oJson["status"] == "OK"
      Conout("Status está OK!")
    Else
      Conout("Status não está OK ou não encontrado.")
    EndIf
  Return
  
  Static Function IsValidCPF(cCpf)
    Local cClean := ""
    Local i, nSum, nRest

    For i := 1 To Len(cCpf)
      If IsDigit(SubStr(cCpf,i,1))
        cClean += SubStr(cCpf,i,1)
      EndIf
    Next i

    If Len(cClean) <> 11
      Return .F.
    EndIf

    If (cClean == Replicate(SubStr(cClean,1,1),11))
      Return .F.
    EndIf

    nSum := 0
    For i := 1 To 9
      nSum += Val(SubStr(cClean,i,1)) * (11 - i)
    Next i
    nRest := 11 - (nSum % 11)
    If (nRest == 10 .Or. nRest == 11)
      nRest := 0
    EndIf
    If nRest <> Val(SubStr(cClean,10,1))
      Return .F.
    EndIf

    nSum := 0
    For i := 1 To 10
      nSum += Val(SubStr(cClean,i,1)) * (12 - i)
    Next i
    nRest := 11 - (nSum % 11)
    If (nRest == 10 .Or. nRest == 11)
      nRest := 0
    EndIf

    Return (nRest == Val(SubStr(cClean,11,1)))
  EndFunc
  REPORT z_chamar_api.
  
  DATA: lv_token          TYPE string VALUE 'SEU_TOKEN_AQUI',
        lv_cpf            TYPE string VALUE '12345678901',
        lv_data_nasc      TYPE string VALUE '03061988',
        lv_url            TYPE string,
        lv_response       TYPE string,
        lv_status_code    TYPE i,
        lv_encoded_token  TYPE string,
        lv_encoded_cpf    TYPE string,
        lv_encoded_dn     TYPE string,
        lv_valid_cpf      TYPE abap_bool.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_token
    IMPORTING escaped   = lv_encoded_token.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_cpf
    IMPORTING escaped   = lv_encoded_cpf.
  
  CALL FUNCTION 'ESCAPE_URL'
    EXPORTING unescaped = lv_data_nasc
    IMPORTING escaped   = lv_encoded_dn.
  
  PERFORM is_valid_cpf USING lv_cpf CHANGING lv_valid_cpf.
  IF lv_valid_cpf <> abap_true.
    WRITE: / 'CPF inválido!'.
    EXIT.
  ENDIF.
  
  lv_url = |https://www.sintegraws.com.br/api/v1/execute-api.php?token={ lv_encoded_token }&cpf={ lv_encoded_cpf }&data-nascimento={ lv_encoded_dn }&plugin=CPF|.
  
  DATA(lo_http_client) = NEW cl_http_client( ).
  
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING url = lv_url
    IMPORTING client = lo_http_client
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao criar o HTTP Client'.
    EXIT.
  ENDIF.
  
  lo_http_client->timeout = 120.
  lo_http_client->request->set_header_field( name = '~request_method' value = 'GET' ).
  
  CALL METHOD lo_http_client->send
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao enviar requisição HTTP.'.
    EXIT.
  ENDIF.
  
  CALL METHOD lo_http_client->receive
    EXCEPTIONS OTHERS = 4.
  
  IF sy-subrc <> 0.
    WRITE: / 'Erro ao receber resposta HTTP.'.
    EXIT.
  ENDIF.
  
  lv_status_code = lo_http_client->response->get_status( ).
  IF lv_status_code <> 200.
    WRITE: / |Erro na requisição: { lv_status_code }|.
    lo_http_client->close( ).
    EXIT.
  ENDIF.
  
  lv_response = lo_http_client->response->get_data( ).
  lo_http_client->close( ).
  
  DATA(lo_json) = NEW /ui2/cl_json( ).
  DATA(ls_result) = lo_json->deserialize( EXPORTING json = lv_response ).
  
  DATA(lv_status) = VALUE string( ls_result[ 'status' ] ).
  
  IF lv_status = 'OK'.
    WRITE: / 'Status está OK!'.
  ELSE.
    WRITE: / 'Status não está OK ou não encontrado.'.
  ENDIF.
  
  FORM is_valid_cpf USING p_cpf TYPE string CHANGING p_valid TYPE abap_bool.
    DATA: lv_cpf TYPE string.
    lv_cpf = p_cpf.
    TRANSLATE lv_cpf TO UPPER CASE.
    REPLACE ALL NON DIGITS IN lv_cpf WITH ''.
  
    IF strlen( lv_cpf ) <> 11.
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    DATA lv_first TYPE c LENGTH 1.
    lv_first = lv_cpf(1).
  
    IF lv_cpf = lv_first && lv_cpf = lv_first(11).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    DATA: i TYPE i, sum TYPE i, rest TYPE i, val TYPE i.
    sum = 0.
    DO 9 TIMES.
      i = sy-index.
      val = lv_cpf+i(1).
      sum = sum + val * (10 - i).
    ENDDO.
    rest = 11 - ( sum MOD 11 ).
    IF rest = 10 OR rest = 11.
      rest = 0.
    ENDIF.
    IF rest <> lv_cpf+9(1).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    sum = 0.
    DO 10 TIMES.
      i = sy-index.
      val = lv_cpf+i(1).
      sum = sum + val * (11 - i).
    ENDDO.
    rest = 11 - ( sum MOD 11 ).
    IF rest = 10 OR rest = 11.
      rest = 0.
    ENDIF.
    IF rest <> lv_cpf+10(1).
      p_valid = abap_false.
      RETURN.
    ENDIF.
  
    p_valid = abap_true.
  ENDFORM.