diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 31fc9257c397fabc7d2eacd7a9348ee163b1f982..6a1c2c330316d461443966bc447385aebdbf545a 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -130,6 +130,8 @@ const universityLocalOffer = require(`${libs}/routes/universityLocalOffer`);
 
 const message = require(`${libs}/routes/message`);
 
+const courseStudents = require(`${libs}/routes/courseStudents`);
+
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API is running' });
 });
@@ -186,4 +188,6 @@ api.use('/location', location);
 api.use('/disciplines', disciplines);
 api.use('/universityLocalOffer', universityLocalOffer);
 api.use('/message', message);
+api.use('/courseStudents', courseStudents);
+
 module.exports = api;
diff --git a/src/libs/routes/courseStudents.js b/src/libs/routes/courseStudents.js
new file mode 100644
index 0000000000000000000000000000000000000000..82ca6ca771d8bf5d5dbe12cb99600e76b131cab7
--- /dev/null
+++ b/src/libs/routes/courseStudents.js
@@ -0,0 +1,192 @@
+const express = require('express');
+
+const courseStudentsApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const response = require(`${libs}/middlewares/response`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+let rqf = new ReqQueryFields();
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValueToField({
+    name: 'state',
+    table: 'localoferta_ens_superior2',
+    tableField: 'cod_uf',
+    resultField: 'state_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_uf',
+	    table: 'localoferta_ens_superior2'
+    }
+}, 'filter').addValue({
+    name: 'mesoregion',
+    table: 'municipio',
+    tableField: ['nome_mesorregiao', 'mesorregiao_id'],
+    resultField: ['mesoregion_name', 'mesoregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'mesorregiao_id',
+        table: 'municipio'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio',
+        foreignTable: 'localoferta_ens_superior2'
+    }
+}).addValue({
+    name: 'microregion',
+    table: 'municipio',
+    tableField: ['nome_microrregiao', 'microrregiao_id'],
+    resultField: ['microregion_name', 'microregion_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'microrregiao_id',
+        table: 'municipio'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio',
+        foreignTable: 'localoferta_ens_superior2'
+    }
+}).addValue({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['id', 'nome'],
+    resultField: ['city_id', 'city_name'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id',
+        table: 'municipio'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'cod_municipio',
+        foreignTable: 'localoferta_ens_superior2'
+    }
+}).addValue({
+    name: 'min_year',
+    table: 'localoferta_ens_superior2',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        table: 'localoferta_ens_superior2',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: 'localoferta_ens_superior2',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        table: 'localoferta_ens_superior2',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name:'course',
+    table: 'curso_ens_superior',
+    tableField: 'nome_curso',
+    resultField: 'course_name',
+    where: {
+        relation: '=',
+        type: 'string',
+        field: 'nome_curso'
+    }
+}).addValue({
+    name:'upper_education_mod',
+    table: 'curso_ens_superior',
+    tableField: 'cod_modalidade_ensino',
+    resultField: 'upper_education_mod_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_modalidade_ensino'
+    }
+}).addValue({
+    name:'upper_adm_dependency',
+    table: 'curso_ens_superior',
+    tableField: 'par_categoria_administrativa',
+    resultField: 'upper_adm_dependency_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'par_categoria_administrativa'
+    }
+}).addValue({
+    name:'academic_organization',
+    table: 'curso_ens_superior',
+    tableField: 'cod_organizacao_academica',
+    resultField: 'academic_organization_id',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'cod_organizacao_academica'
+    }
+}).addValueToField({
+    name: 'campi',
+    table: 'localoferta_ens_superior',
+    tableField: ['cod_local_oferta', 'nome'],
+    resultField: ['campi_id', 'campi_name'],
+    where: {
+	    relation: '=',
+	    type: 'integer',
+	    field: 'cod_local_oferta',
+	    table: 'localoferta_ens_superior'
+    }
+}, 'filter')
+
+courseStudentsApp.get('/', rqf.parse(), (req, res, next) => {
+    var b = squel.select().from(
+            squel.select().from('localoferta_ens_superior')
+            .field("localoferta_ens_superior.cod_curso", "cod_curso")
+            .field("localoferta_ens_superior.ano_censo", "ano_censo")
+            .field("ies_ens_superior.cod_municipio_ies", "cod_municipio")
+            .field("ies_ens_superior.cod_uf_ies", "cod_uf")
+            .join("ies_ens_superior on ies_ens_superior.cod_ies = localoferta_ens_superior.cod_ies AND ies_ens_superior.ano_censo=localoferta_ens_superior.ano_censo")
+            .group("localoferta_ens_superior.cod_curso" )    
+            .group("localoferta_ens_superior.ano_censo" )
+            .group("ies_ens_superior.cod_uf_ies")
+            .group("ies_ens_superior.cod_municipio_ies")
+        , "localoferta_ens_superior2")
+        .field("localoferta_ens_superior2.ano_censo", "year")
+        .field("SUM(curso_ens_superior.quantidade_inscritos_total)", "inscritos_total")        
+        .field("SUM(curso_ens_superior.quantidade_vagas_totais)", "vagas_totais")
+        .field("SUM(curso_ens_superior.quantidade_ingresso_curso)", "ingresso_curso")
+        .join("curso_ens_superior ON (localoferta_ens_superior2.cod_curso = curso_ens_superior.cod_curso) AND (localoferta_ens_superior2.ano_censo = curso_ens_superior.ano_censo)")
+        .where("curso_ens_superior.cod_nivel_academico = 1")
+        .where("(curso_ens_superior.tipo_atributo_ingresso <> 1 OR curso_ens_superior.tipo_atributo_ingresso is NULL)")
+        .where("(curso_ens_superior.cod_grau_academico = 2 OR curso_ens_superior.cod_grau_academico = 4) ")   
+        .group("localoferta_ens_superior2.ano_censo")
+        .order("localoferta_ens_superior2.ano_censo")
+
+    req.sql = b;
+    next();
+}, rqf.build(), (req, res, next) => {
+    console.log(req.sql.toString()); 
+    next();
+}, query, id2str.transform(), response('course_students'))
+
+module.exports = courseStudentsApp;