Documentação da API padrão do Puca

Este documento contém a documentação completa da API, incluindo métodos de autenticação, headers necessários, endpoints disponíveis, formatos de payload e exemplos práticos de uso.

Índice

  1. Autenticação
  2. Headers
  3. Endpoints
  4. Payloads
  5. Exemplos de Uso

Autenticação

Para utilizar a API, é necessário seguir um processo de autenticação em duas etapas:

1. Obtenção da API Key

Antes de fazer requisições à API, você precisa obter uma API Key seguindo estes passos:

  1. Acesse o menu Sys → Integrações → Robos no sistema
  2. Adicione um novo robô vinculado a um usuário válido
    • Pode ser necessário criar um usuário no sistema previamente
    • Certifique-se de adicionar as permissões necessárias a este usuário
  3. Após a criação do robô, você terá acesso à API Key associada a ele

2. Obtenção do Token de Autenticação

Com a API Key em mãos, você deve obter um token de autenticação:

POST /puca-user/system_user/login

Body:

{
  "api_key": "sua_api_key_aqui"
}

Resposta:
A resposta conterá um token de autenticação que deve ser utilizado em todas as requisições subsequentes.

3. Utilização do Token

Para todas as requisições à API, inclua o token obtido no header Authorization:

Authorization: seu_token_aqui

Importante: O token deve ser incluído em todas as requisições subsequentes para autenticar o acesso à API.

Headers

Para realizar requisições à API, os seguintes headers são obrigatórios:

Headers Obrigatórios

Header Valor Descrição
Authorization {token} Token de autenticação obtido através do endpoint de login.
Content-Type application/json Define o formato do conteúdo enviado nas requisições como JSON.

Exemplo de Headers

Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

Endpoints

Esta seção descreve os endpoints disponíveis na API, seus métodos HTTP suportados e exemplos de uso.

Endpoints Disponíveis

A API possui diversos endpoints que variam de acordo com a tabela do sistema. Abaixo está documentado o endpoint de pessoa/empresa como exemplo:

Endpoint: puca-crm-api/person

Este endpoint permite gerenciar dados de pessoas e empresas no sistema.

Métodos Suportados
Método Descrição
GET Consultar pessoas/empresas
POST Criar ou atualizar pessoas/empresas
DELETE Remover pessoas/empresas
GET

O método GET pode ser utilizado de duas maneiras:

1. Consulta com Query Puca
GET /puca-crm-api/person

Para este método, é necessário enviar uma query Puca no corpo da requisição, conforme definido na documentação de queries.

Exemplo de consulta pelos campos ‘name’, ‘cpf_cnpj’ e ‘puca_key’:

{
  "from": "puca_crm_api_person",
  "fields": [
    "puca_key",
    "name",
    "cpf_cnpj"
  ]
}

Exemplo com filtro:

{
  "from": "puca_crm_api_person",
  "fields": [
    "puca_key",
    "name",
    "cpf_cnpj"
  ],
  "args": {
    "natureza": "J"
  },
  "where": {
    "and": [
      {
        "v1": "natureza",
        "operator": "equals",
        "v2": "$natureza"
      }
    ]
  }
}
2. Consulta por ID
GET /puca-crm-api/person/:id

Para este método, é necessário fornecer o ID (uuid) do registro e o parâmetro fields na query string.

Parâmetros:

  • :id - UUID do registro no sistema
  • fields - Campos a serem retornados (separados por vírgula)

Exemplo:

GET /puca-crm-api/person/550e8400-e29b-41d4-a716-446655440000?fields=name,cpf_cnpj,puca_key
POST

O método POST pode ser utilizado de duas maneiras:

1. Criação de novo registro
POST /puca-crm-api/person

Corpo da requisição:

{
  "name": "Nome da Pessoa ou Empresa",
  "cpf_cnpj": "12345678901",
  "contact_email": "[email protected]",
  ...
}
2. Atualização de registro existente (Upinsert)
POST /puca-crm-api/person

Corpo da requisição:

{
  "puca_pid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Nome Atualizado",
  "cpf_cnpj": "12345678901",
  ...
}

Nota: As colunas disponíveis podem ser encontradas no path: https://[[host]]/puca-base-front/3.4.5/#/module/0=puca-crud-front%2Flist%2Fuser_table_dictionary&1=puca-crud-front%2Fdictionary%2F[[nome da tabela]]

DELETE
DELETE /puca-crm-api/person/:id

Parâmetros:

  • :id - UUID do registro a ser removido

Permissões

Todas as APIs só executarão ações que o usuário vinculado ao robô tenha acesso. Certifique-se de que o usuário associado à API Key possua as permissões necessárias para as operações desejadas.

Validações e Restrições

  • As operações estão sujeitas às permissões do usuário vinculado ao robô
  • Os campos obrigatórios devem ser preenchidos conforme o dicionário de dados da tabela
  • O formato e as validações específicas de cada campo (como formato de CPF/CNPJ, email, etc.) são definidos no dicionário de dados da tabela

Exemplos de Uso

Esta seção fornece exemplos práticos de como utilizar a API com diferentes ferramentas e linguagens de programação.

Autenticação

Todos os exemplos abaixo assumem que você já possui uma API Key obtida através do menu Sys → Integrações → Robos no sistema.

Obtenção do Token de Autenticação

cURL
curl -X POST \
  https://[[host]]/puca-user/system_user/login \
  -H 'Content-Type: application/json' \
  -d '{
    "api_key": "sua_api_key_aqui"
  }'
JavaScript (Fetch API)
const obterToken = async () => {
  const response = await fetch('https://[[host]]/puca-user/system_user/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      api_key: 'sua_api_key_aqui'
    })
  });
  
  const data = await response.json();
  const token = data.token; // Ajuste conforme a estrutura real da resposta
  
  return token;
};

Exemplos de Operações com o Endpoint de Pessoa/Empresa

GET - Consulta com Query Puca

JavaScript (Fetch API)
const consultarPessoas = async (token) => {
  const response = await fetch('https://[[host]]/puca-crm-api/person', {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      from: 'puca_crm_api_person',
      fields: [
        'puca_key',
        'name',
        'cpf_cnpj'
      ],
      "args": {
        "natureza": "J"
      },
      where: {
        and: [
          {
            v1: 'natureza',
            operator: 'equals',
            v2: '$natureza'
          }
        ]
      }
    })
  });
  
  const data = await response.json();
  return data;
};

GET - Consulta por ID

cURL
curl -X GET \
  'https://[[host]]/puca-crm-api/person/550e8400-e29b-41d4-a716-446655440000?fields=name,cpf_cnpj,puca_key' \
  -H 'Authorization: seu_token_aqui' \
  -H 'Content-Type: application/json'
JavaScript (Fetch API)
const consultarPessoaPorId = async (token, id) => {
  const response = await fetch(`https://[[host]]/puca-crm-api/person/${id}?fields=name,cpf_cnpj,puca_key`, {
    method: 'GET',
    headers: {
      'Authorization': `${token}`,
      'Content-Type': 'application/json'
    }
  });
  
  const data = await response.json();
  return data;
};

POST - Criação de Novo Registro

cURL
curl -X POST \
  https://[[host]]/puca-crm-api/person \
  -H 'Authorization: seu_token_aqui' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Nome da Pessoa ou Empresa",
    "cpf_cnpj": "12345678901",
    "contact_email": "[email protected]"
  }'
JavaScript (Fetch API)
const criarPessoa = async (token, dadosPessoa) => {
  const response = await fetch('https://[[host]]/puca-crm-api/person', {
    method: 'POST',
    headers: {
      'Authorization': `${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(dadosPessoa)
  });
  
  const data = await response.json();
  return data;
};

// Exemplo de uso
const dadosPessoa = {
  name: 'Nome da Pessoa ou Empresa',
  cpf_cnpj: '12345678901',
  contact_email: '[email protected]'
};

criarPessoa(token, dadosPessoa)
  .then(resultado => console.log(resultado))
  .catch(erro => console.error(erro));

POST - Atualização de Registro Existente (Upinsert)

cURL
curl -X POST \
  https://[[host]]/puca-crm-api/person \
  -H 'Authorization: seu_token_aqui' \
  -H 'Content-Type: application/json' \
  -d '{
    "puca_pid": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Nome Atualizado",
    "cpf_cnpj": "12345678901",
    "contact_email": "[email protected]"
  }'
JavaScript (Fetch API)
const atualizarPessoa = async (token, dadosPessoa) => {
  const response = await fetch('https://[[host]]/puca-crm-api/person', {
    method: 'POST',
    headers: {
      'Authorization': `${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(dadosPessoa)
  });
  
  const data = await response.json();
  return data;
};

// Exemplo de uso
const dadosPessoa = {
  puca_pid: '550e8400-e29b-41d4-a716-446655440000',
  name: 'Nome Atualizado',
  cpf_cnpj: '12345678901',
  contact_email: '[email protected]'
};

atualizarPessoa(token, dadosPessoa)
  .then(resultado => console.log(resultado))
  .catch(erro => console.error(erro));

DELETE - Remoção de Registro

cURL
curl -X DELETE \
  https://[[host]]/puca-crm-api/person/550e8400-e29b-41d4-a716-446655440000 \
  -H 'Authorization: seu_token_aqui' \
  -H 'Content-Type: application/json'
JavaScript (Fetch API)
const removerPessoa = async (token, id) => {
  const response = await fetch(`https://[[host]]/puca-crm-api/person/${id}`, {
    method: 'DELETE',
    headers: {
      'Authorization': `${token}`,
      'Content-Type': 'application/json'
    }
  });
  
  const data = await response.json();
  return data;
};

// Exemplo de uso
removerPessoa(token, '550e8400-e29b-41d4-a716-446655440000')
  .then(resultado => console.log(resultado))
  .catch(erro => console.error(erro));

Collection Postman

{
	"info": {
		"_postman_id": "b403dbd9-9cb5-47aa-8abd-2564efd323fa",
		"name": "Puca API Exemplo",
		"description": "Coleção de exemplo para a API Puca, baseada na documentação gerada. Inclui autenticação e operações para o endpoint de Pessoa/Empresa.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "40102894"
	},
	"item": [
		{
			"name": "Autenticação",
			"item": [
				{
					"name": "Obter Token de Autenticação",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"// Extrair o token da resposta e definir a variável da coleção",
									"try {",
									"    var jsonData = pm.response.json();",
									"    if (jsonData && jsonData.token) { // Ajuste 'jsonData.token' conforme a estrutura real da resposta",
									"        pm.collectionVariables.set(\"auth_token\", jsonData.token);",
									"        console.log(\"Token de autenticação salvo na variável 'auth_token'\");",
									"    } else {",
									"        console.error(\"Token não encontrado na resposta. Verifique a estrutura da resposta JSON.\");",
									"    }",
									"} catch (e) {",
									"    console.error(\"Erro ao processar a resposta JSON: \", e);",
									"}"
								],
								"type": "text/javascript",
								"packages": {}
							}
						},
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									""
								],
								"type": "text/javascript",
								"packages": {}
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"api_key\": \"{{api_key}}\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/puca-user/system_user/login",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-user",
								"system_user",
								"login"
							]
						},
						"description": "Obtém o token de autenticação usando a API Key. O token é salvo automaticamente na variável de coleção 'auth_token'."
					},
					"response": []
				}
			]
		},
		{
			"name": "Pessoa/Empresa (puca-crm-api/person)",
			"item": [
				{
					"name": "GET - Consultar Pessoas (Query Puca com Filtro)",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"const obj = { ",
									"    args: {",
									"        puca_key: 8",
									"    },",
									"    where: {",
									"        v1: 'puca_key',",
									"        v2: '$puca_key',",
									"        operator: 'equals'",
									"    }",
									" };",
									"pm.variables.set('args', encodeURIComponent(JSON.stringify(obj.args)));",
									"pm.variables.set('where', encodeURIComponent(JSON.stringify(obj.where)));"
								],
								"type": "text/javascript",
								"packages": {}
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "{{auth_token}}",
								"type": "text"
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"url": {
							"raw": "{{base_url}}/puca-crm-api/person?fields[0]=puca_pid&fields[1]=name&args={{args}}&where={{where}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-crm-api",
								"person"
							],
							"query": [
								{
									"key": "fields[0]",
									"value": "puca_pid"
								},
								{
									"key": "fields[1]",
									"value": "name"
								},
								{
									"key": "args",
									"value": "{{args}}"
								},
								{
									"key": "where",
									"value": "{{where}}"
								}
							]
						},
						"description": "Consulta pessoas/empresas usando Query Puca no corpo da requisição, com filtro para natureza = 'J'."
					},
					"response": []
				},
				{
					"name": "GET - Consultar Pessoa por ID",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Authorization",
								"value": "{{auth_token}}",
								"type": "text"
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"url": {
							"raw": "{{base_url}}/puca-crm-api/person/{{person_id}}?fields[0]=cpf_cnpj",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-crm-api",
								"person",
								"{{person_id}}"
							],
							"query": [
								{
									"key": "fields[0]",
									"value": "cpf_cnpj"
								}
							]
						},
						"description": "Consulta uma pessoa/empresa específica pelo seu ID (UUID). O ID deve ser definido na variável 'person_id'."
					},
					"response": []
				},
				{
					"name": "POST - Criar Pessoa/Empresa",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "{{auth_token}}",
								"type": "text"
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"name\": \"Nome Exemplo LTDA\",\n    \"cpf_cnpj\": \"12345678000199\",\n    \"natureza\": \"J\" \n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/puca-crm-api/person",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-crm-api",
								"person"
							]
						},
						"description": "Cria um novo registro de pessoa/empresa."
					},
					"response": []
				},
				{
					"name": "POST - Atualizar Pessoa/Empresa (Upinsert)",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Authorization",
								"value": "{{auth_token}}",
								"type": "text"
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"puca_pid\": \"{{person_id}}\",\n    \"name\": \"Nome Exemplo Atualizado LTDA\",\n    \"cpf_cnpj\": \"12345678000199\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/puca-crm-api/person",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-crm-api",
								"person"
							]
						},
						"description": "Atualiza um registro existente de pessoa/empresa utilizando o puca_pid. O ID deve ser definido na variável 'person_id'."
					},
					"response": []
				},
				{
					"name": "DELETE - Remover Pessoa/Empresa",
					"request": {
						"method": "DELETE",
						"header": [
							{
								"key": "Authorization",
								"value": "Bearer {{auth_token}}",
								"type": "text"
							},
							{
								"key": "Content-Type",
								"value": "application/json",
								"type": "text"
							}
						],
						"url": {
							"raw": "{{base_url}}/puca-crm-api/person/{{person_id}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"puca-crm-api",
								"person",
								"{{person_id}}"
							]
						},
						"description": "Remove um registro de pessoa/empresa pelo seu ID (UUID). O ID deve ser definido na variável 'person_id'."
					},
					"response": []
				}
			]
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		}
	]
}

Existe mais um endpoint que pode ser útil ou simplificar as consultas:

Endpoint: POST /find

Este endpoint permite realizar consultas complexas utilizando a Query Puca enviada diretamente no corpo da requisição, utilizando o método POST. Isso pode facilitar o envio de queries mais longas ou complexas que poderiam exceder limites de URL se enviadas via GET.

Requisição

POST /find

Contexto: Este endpoint deve ser utilizado no contexto da entidade desejada. Por exemplo, para buscar pessoas/empresas, o path completo seria puca-crm-api/person/find.

Headers Obrigatórios:

Header Valor Descrição
Authorization Bearer {token} Token de autenticação obtido através do endpoint de login.
Content-Type application/json Define o formato do conteúdo enviado na requisição como JSON.

Corpo da Requisição (Payload):

O corpo da requisição deve conter um objeto JSON representando a Query Puca, conforme a estrutura definida na documentação de queries.

Exemplo de Payload (buscando pessoas/empresas com natureza = ‘J’):

{
  "from": "puca_crm_api_person",
  "fields": [
    "puca_key",
    "name",
    "cpf_cnpj"
  ],
  "where": {
    "and": [
      {
        "v1": "natureza",
        "operator": "equals",
        "v2": "J"
      }
    ]
  }
}

Resposta

Sucesso (200 OK):
A resposta conterá um array de objetos JSON, onde cada objeto representa um registro encontrado que corresponde aos critérios da query.

[
  {
    "puca_key": 123,
    "name": "Empresa Exemplo 1",
    "cpf_cnpj": "11222333000144"
  },
  {
    "puca_key": 456,
    "name": "Empresa Exemplo 2",
    "cpf_cnpj": "44555666000177"
  }
]

Erro:
Em caso de erro (query inválida, token inválido, etc.), a API retornará um status de erro apropriado (como 400, 401, 500) com uma mensagem descritiva no corpo da resposta.

Permissões

A consulta retornará apenas os dados aos quais o usuário vinculado ao robô (e ao token) tem permissão de acesso.

Exemplos de Uso

cURL

curl -X POST \
  https://[[host]]/puca-crm-api/person/find \
  -H 'Authorization: Bearer seu_token_aqui' \
  -H 'Content-Type: application/json' \
  -d '{
    "from": "puca_crm_api_person",
    "fields": [
      "puca_key",
      "name",
      "cpf_cnpj"
    ],
    "where": {
      "and": [
        {
          "v1": "natureza",
          "operator": "equals",
          "v2": "J"
        }
      ]
    }
  }'

JavaScript (Fetch API)

const buscarComPost = async (token, queryPuca) => {
  const response = await fetch('https://[[host]]/puca-crm-api/person/find', { // Ajuste o path conforme a entidade
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(queryPuca)
  });
  
  const data = await response.json();
  return data;
};

// Exemplo de uso
const query = {
  from: 'puca_crm_api_person',
  fields: [
    'puca_key',
    'name',
    'cpf_cnpj'
  ],
  where: {
    and: [
      {
        v1: 'natureza',
        operator: 'equals',
        v2: 'J'
      }
    ]
  }
};

buscarComPost(token, query)
  .then(resultado => console.log(resultado))
  .catch(erro => console.error(erro));

Postman

  1. Crie uma nova requisição POST
  2. URL: {{base_url}}/puca-crm-api/person/find (Ajuste o path conforme a entidade)
  3. Na aba Headers, adicione:
    • Key: Authorization
    • Value: Bearer {{auth_token}}
    • Key: Content-Type
    • Value: application/json
  4. Na aba Body, selecione “raw” e “JSON”, e insira:
    {
      "from": "puca_crm_api_person",
      "fields": [
        "puca_key",
        "name",
        "cpf_cnpj"
      ],
      "where": {
        "and": [
          {
            "v1": "natureza",
            "operator": "equals",
            "v2": "J"
          }
        ]
      }
    }
    
  5. Clique em “Send”