2) Regras gerais de autenticação
Todos os endpoints da Evolução devem receber as credenciais do app nos headers.
X-APP-KEY: <APP_KEY_FIXA_DO_APP>
X-DEVICE-TOKEN: <DEVICE_TOKEN_SALVO_NO_APARELHO>
O X-DEVICE-TOKEN identifica o cliente/aparelho.
A API deve validar se a participação G10 solicitada pertence ao cliente vinculado ao device.
3.1) Endpoint — Listar Galeria
POST
https://agroecologia.grupoekos.com.br/router/action.php
Body
action=apiG10
f=evolucao_galeria
id_g10_participacao=2
Resposta esperada
{
"success": true,
"msg": "Galeria da evolução carregada com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"total_fotos": 2,
"fotos": [
{
"id_foto": 12,
"url": "https://agroecologia.grupoekos.com.br/router/action.php",
"action": "apiG10",
"f": "foto_evolucao",
"data_foto": "2026-05-05",
"hora_foto": "10:35:20",
"latitude": "-21.86454000",
"longitude": "-47.49973000",
"observacao": "Foto da área central do talhão",
"tipo_foto": "chao"
}
]
}
}
3.2) Endpoint — Entregar imagem da Evolução
POST foto_evolucao
URL
https://agroecologia.grupoekos.com.br/router/action.php
Headers
X-APP-KEY: <APP_KEY_FIXA_DO_APP>
X-DEVICE-TOKEN: <DEVICE_TOKEN_SALVO_NO_APARELHO>
Body
action=apiG10
f=foto_evolucao
id_foto=12
Esse endpoint não deve ser chamado via GET, link direto, navegador,
<img src=""> ou componente de imagem que não envie headers.
O app deve fazer uma requisição POST, enviando os headers de autenticação e o
id_foto no body. Se estiver tudo correto, a API retorna o binário da imagem com
Content-Type: image/jpeg ou image/png.
4.1) Endpoint — Listar análises
POST
https://agroecologia.grupoekos.com.br/router/action.php
Body
action=apiG10
f=evolucao_analises
id_g10_participacao=2
Ligação das tabelas
g10_participacoes.id_cliente
↓
clientes_analises.id_cliente
↓
clientes_analises.id_analise
↓
analises.id
Resposta esperada
{
"success": true,
"msg": "Análises da evolução carregadas com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"total_analises": 2,
"analises": [
{
"id_analise": 15,
"dia": "2026-04-20",
"tipo": "folha",
"label": "20/04/26 - Análise de Folha",
"url_pdf": "https://agroecologia.grupoekos.com.br/router/action.php?action=apiG10&f=pdf_evolucao_analise&id_analise=15"
}
]
}
}
4.2) Endpoint — Entregar PDF da análise
GET pdf_evolucao_analise
URL
https://agroecologia.grupoekos.com.br/router/action.php?action=apiG10&f=pdf_evolucao_analise&id_analise=15
Esse endpoint deve validar novamente X-APP-KEY e X-DEVICE-TOKEN.
A API só entrega o PDF se a análise pertencer ao cliente do device.
5.1.1) Endpoint — Listar análises para comparação por indicador
POST evolucao_analises_indicador
Body
action=apiG10
f=evolucao_analises_indicador
id_g10_participacao=2
Resposta esperada
{
"success": true,
"msg": "Análises para comparação por indicador carregadas com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"total_analises": 3,
"pode_comparar": true,
"analises": [
{
"id_analise": 10,
"dia": "2026-05-01",
"tipo": "solo",
"label": "01/05/26 - Análise de Solo",
"total_indicadores": 18
},
{
"id_analise": 15,
"dia": "2026-05-15",
"tipo": "folha",
"label": "15/05/26 - Análise de Folha",
"total_indicadores": 20
},
{
"id_analise": 22,
"dia": "2026-05-30",
"tipo": "micro",
"label": "30/05/26 - Análise Microbiológica",
"total_indicadores": 16
}
]
}
}
Regra no app
Se total_analises for menor que 2 ou pode_comparar vier como falso,
o app deve exibir:
Não há análises suficientes para comparação.
5.1.2) Endpoint — Listar indicadores de uma análise
POST evolucao_indicadores_analise
Body
action=apiG10
f=evolucao_indicadores_analise
id_g10_participacao=2
id_analise=10
Resposta esperada
{
"success": true,
"msg": "Indicadores da análise carregados com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"analise": {
"id_analise": 10,
"dia": "2026-05-01",
"tipo": "solo",
"label": "01/05/26 - Análise de Solo"
},
"total_indicadores": 18,
"indicadores": [
{
"id_resultado": 501,
"indicador_slug": "potassio",
"indicador_nome": "Potássio",
"grupo_nome": "Indicadores que estão dentro do parâmetro ideal",
"subgrupo_nome": "",
"valor_percentual": 3.8,
"unidade_medida": "mmolc/dm³",
"classificacao_texto": "dentro_do_ideal",
"nivel": "",
"cor": "verde"
},
{
"id_resultado": 502,
"indicador_slug": "fosforo",
"indicador_nome": "Fósforo",
"grupo_nome": "Indicadores que estão fora do parâmetro ideal",
"subgrupo_nome": "",
"valor_percentual": 46,
"unidade_medida": "mg/dm³",
"classificacao_texto": "fora_do_ideal",
"nivel": "",
"cor": "vermelho"
}
]
}
}
Regra
Este endpoint deve retornar somente os indicadores da análise informada.
O app deve exibir indicador_nome, mas guardar/enviar preferencialmente
id_resultado.
5.1.3) Endpoint — Comparar indicadores selecionados
POST evolucao_comparar_indicadores_selecionados
Body recomendado
action=apiG10
f=evolucao_comparar_indicadores_selecionados
id_g10_participacao=2
id_resultado_1=501
id_resultado_2=732
Body alternativo
Usar somente se o app ainda não estiver trabalhando com id_resultado.
action=apiG10
f=evolucao_comparar_indicadores_selecionados
id_g10_participacao=2
id_analise_1=10
indicador_slug_1=potassio
id_analise_2=15
indicador_slug_2=potassio
Resposta esperada
{
"success": true,
"msg": "Comparação carregada com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"comparacao": {
"status": "informativo",
"mensagem": "Mesmo indicador, mas com unidades diferentes. Exibir lado a lado sem calcular diferença direta.",
"mesmo_indicador": true,
"mesma_unidade": false,
"diferenca_valor": null
},
"colunas": {
"primeiro": {
"analise": {
"id_analise": 10,
"dia": "2026-05-01",
"tipo": "solo",
"label": "01/05/26 - Análise de Solo"
},
"indicador": {
"id_resultado": 501,
"indicador_slug": "potassio",
"indicador_nome": "Potássio",
"grupo_nome": "Indicadores que estão dentro do parâmetro ideal",
"subgrupo_nome": "",
"valor_percentual": 3.8,
"unidade_medida": "mmolc/dm³",
"parametro_min": 1.6,
"parametro_max": 5,
"parametro_unidade": "mmolc/dm³",
"status_percentual": null,
"status_direcao": "",
"classificacao_texto": "dentro_do_ideal",
"nivel": "",
"cor": "verde",
"descricao_o_que_e": "Essencial para a regulação hídrica, fotossíntese e produção de açúcares.",
"descricao_significado": "",
"interpretacao_tecnica": "",
"descricao_o_que_fazer": ""
}
},
"segundo": {
"analise": {
"id_analise": 15,
"dia": "2026-05-15",
"tipo": "folha",
"label": "15/05/26 - Análise de Folha"
},
"indicador": {
"id_resultado": 732,
"indicador_slug": "potassio",
"indicador_nome": "Potássio",
"grupo_nome": "Indicadores que estão dentro do parâmetro ideal",
"subgrupo_nome": "",
"valor_percentual": 18.5,
"unidade_medida": "g/kg",
"parametro_min": 10,
"parametro_max": 20,
"parametro_unidade": "g/kg",
"status_percentual": null,
"status_direcao": "",
"classificacao_texto": "dentro_do_ideal",
"nivel": "",
"cor": "verde",
"descricao_o_que_e": "Importante para equilíbrio osmótico, transporte de açúcares e qualidade dos frutos.",
"descricao_significado": "",
"interpretacao_tecnica": "",
"descricao_o_que_fazer": ""
}
}
}
}
}
5.2.1) Endpoint — Listar análises comparáveis
POST evolucao_analises_comparaveis
Body
action=apiG10
f=evolucao_analises_comparaveis
id_g10_participacao=2
Resposta esperada
{
"success": true,
"msg": "Análises comparáveis carregadas com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"total_analises": 3,
"analises": [
{
"id_analise": 10,
"dia": "2026-05-01",
"tipo": "solo",
"label": "01/05/26 - Análise de Solo",
"total_indicadores": 18
},
{
"id_analise": 15,
"dia": "2026-05-15",
"tipo": "folha",
"label": "15/05/26 - Análise de Folha",
"total_indicadores": 20
},
{
"id_analise": 22,
"dia": "2026-05-30",
"tipo": "solo",
"label": "30/05/26 - Análise de Solo",
"total_indicadores": 18
}
]
}
}
Regra no app
- O select de análise inicial pode listar todas as análises.
- O select de análise final deve mostrar apenas análises posteriores à inicial.
- O app não deve permitir comparar dia 30 contra dia 01.
- A API também valida a ordem por segurança.
5.2.2) Endpoint — Comparar análises completas
POST evolucao_comparar_analises
Body
action=apiG10
f=evolucao_comparar_analises
id_g10_participacao=2
id_analise_inicial=10
id_analise_final=22
Resposta esperada
{
"success": true,
"msg": "Comparação entre análises carregada com sucesso.",
"data": {
"id_g10_participacao": 2,
"cliente_id": 664,
"analise_inicial": {
"id_analise": 10,
"dia": "2026-05-01",
"tipo": "solo",
"label": "01/05/26 - Análise de Solo"
},
"analise_final": {
"id_analise": 22,
"dia": "2026-05-30",
"tipo": "solo",
"label": "30/05/26 - Análise de Solo"
},
"resumo": {
"total_indicadores_comparados": 16,
"melhoraram": 8,
"pioraram": 2,
"estaveis": 5,
"informativos": 1,
"somente_na_inicial": 1,
"somente_na_final": 2
},
"indicadores_melhoraram": [],
"indicadores_pioraram": [],
"indicadores_estaveis": [],
"indicadores_informativos": [],
"indicadores_somente_inicial": [],
"indicadores_somente_final": [],
"indicadores": []
}
}
8) Lista final de endpoints da Evolução
| Submenu | Endpoint | Função |
|---|---|---|
| 12.1 Galeria | evolucao_galeria |
Lista fotos aprovadas da evolução. |
| 12.1 Galeria | foto_evolucao |
Entrega imagem protegida da evolução. |
| 12.2 Análises | evolucao_analises |
Lista PDFs das análises. |
| 12.2 Análises | pdf_evolucao_analise |
Entrega PDF protegido da análise. |
| 12.3 Comparação por indicador | evolucao_analises_indicador |
Lista análises disponíveis para comparação por indicador. |
| 12.3 Comparação por indicador | evolucao_indicadores_analise |
Lista indicadores de uma análise específica. |
| 12.3 Comparação por indicador | evolucao_comparar_indicadores_selecionados |
Compara dois indicadores selecionados. |
| 12.3 Comparação completa | evolucao_analises_comparaveis |
Lista análises disponíveis para comparação completa. |
| 12.3 Comparação completa | evolucao_comparar_analises |
Compara duas análises usando os indicadores em comum. |