diff --git a/src/libs/convert/educationLevelSchoolYear.js b/src/libs/convert/educationLevelSchoolYear.js
new file mode 100644
index 0000000000000000000000000000000000000000..316efe5efabd62f03ab311cc26684b2cbc8fff58
--- /dev/null
+++ b/src/libs/convert/educationLevelSchoolYear.js
@@ -0,0 +1,36 @@
+module.exports = function educationLevelSchoolYear(id) {
+    switch(id) {
+        case 1: return 'Creche';
+        case 11: return 'Creche - Menor de 1 ano';
+        case 12: return 'Creche - 1 ano';
+        case 13: return 'Creche - 2 anos';
+        case 14: return 'Creche - 3 anos';
+        case 2: return 'Pré-Escola';
+        case 21: return 'Pré-Escola - 4 anos';
+        case 22: return 'Pré-Escola - 5 anos';
+        case 3: return 'Ensino Fundamental - anos iniciais';
+        case 31: return 'Ens. Fundamental - 1º Ano';
+        case 32: return 'Ens. Fundamental - 1ª série/2º ano';
+        case 33: return 'Ens. Fundamental - 2ª série/3º ano';
+        case 34: return 'Ens. Fundamental - 3ª série/4º ano';
+        case 35: return 'Ens. Fundamental - 4ª série/5º Ano';
+        case 4: return 'Ensino Fundamento - anos finais';
+        case 41: return 'Ens. Fundamental - 5ª série/6º ano';
+        case 42: return 'Ens. Fundamental - 6ª série/7º ano';
+        case 43: return 'Ens. Fundamental - 7ª série/8º ano';
+        case 44: return 'Ens. Fundamental - 8ª serie/9º ano';
+        case 5: return 'Ensino Médio';
+        case 51: return 'Ens. Médio - 1ª série';
+        case 52: return 'Ens. Médio - 2ª série';
+        case 53: return 'Ens. Médio - 3ª série';
+        case 54: return 'Ens. Médio - 4ª série';
+        case 6: return 'EJA';
+        case 61: return 'EJA - anos iniciais do Ens. Fundamental';
+        case 62: return 'EJA - anos finais do Ens. Fundamental';
+        case 63: return 'EJA - Ensino Médio';
+        case 64: return 'EJA semi-presencial';
+        case 7: return 'EE exclusiva';
+        case 71: return 'Educação Profissional';
+        default: return 'Não classificada';
+    }
+}
\ No newline at end of file
diff --git a/src/libs/middlewares/id2str.js b/src/libs/middlewares/id2str.js
index 0a0c2af993a392d86b185e234c2eae448992d1b9..0af8421209415ed3adf9c365f551a79ec34ad2d7 100644
--- a/src/libs/middlewares/id2str.js
+++ b/src/libs/middlewares/id2str.js
@@ -30,6 +30,7 @@ const useTransport = require(`${libs}/convert/booleanVariable`);
 const useTransportPublic = require(`${libs}/convert/booleanVariable`);
 const transportationManager = require(`${libs}/convert/transportationManager`);
 const specialClass = require(`${libs}/convert/booleanVariable`);
+const educationLevelSchoolYear = require(`${libs}/convert/educationLevelSchoolYear`);
 
 const ids = {
     gender_id: gender,
@@ -71,7 +72,8 @@ const ids = {
     use_transport_id: useTransport,
     use_transport_public_id: useTransportPublic,
     transportation_manager_id: transportationManager,
-    special_class_id: specialClass
+    special_class_id: specialClass,
+    education_level_school_year_id: educationLevelSchoolYear,
 };
 
 function transform(removeId=false) {
diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js
index 165f947ec7cedacd66008383042bcca6552712bc..d39b0352acf124bbffd66aba66c3d5ab86b39848 100644
--- a/src/libs/routes/api.js
+++ b/src/libs/routes/api.js
@@ -80,6 +80,8 @@ const classCount = require(`${libs}/routes/classCount`);
 
 const portalMecInep = require(`${libs}/routes/portalMecInep`);
 
+const enrollmentProjection = require(`${libs}/routes/enrollmentProjection`);
+
 
 api.get('/', (req, res) => {
     res.json({ msg: 'SimCAQ API is running' });
@@ -123,5 +125,6 @@ api.use('/auxiliar', auxiliar);
 api.use('/verify_teacher', verifyTeacher);
 api.use('/class_count', classCount);
 api.use('/portal_mec_inep', portalMecInep);
+api.use('/enrollment_projection', enrollmentProjection);
 
 module.exports = api;
diff --git a/src/libs/routes/enrollmentProjection.js b/src/libs/routes/enrollmentProjection.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ba72440216c4064b1862cc9d42c4d6d6ac1fbac
--- /dev/null
+++ b/src/libs/routes/enrollmentProjection.js
@@ -0,0 +1,136 @@
+const express = require('express');
+
+const enrollmentProjectionApp = express.Router();
+
+const libs = `${process.cwd()}/libs`;
+
+const log = require(`${libs}/log`)(module);
+
+const squel = require('squel');
+
+const query = require(`${libs}/middlewares/query`).query;
+
+const response = require(`${libs}/middlewares/response`);
+
+const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`);
+
+const id2str = require(`${libs}/middlewares/id2str`);
+
+const config = require(`${libs}/config`);
+
+const addMissing = require(`${libs}/middlewares/addMissing`);
+
+const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware;
+
+enrollmentProjectionApp.use(cache('15 day'));
+
+let rqf = new ReqQueryFields();
+
+rqf.addField({
+    name: 'filter',
+    field: false,
+    where: true
+}).addField({
+    name: 'dims',
+    field: true,
+    where: false
+}).addValueToField({
+    name: 'state',
+    table: 'estado',
+    tableField: ['nome', 'id'],
+    resultField: ['state_name', 'state_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'dims').addValueToField({
+    name: 'state',
+    table: 'estado',
+    tableField: 'nome',
+    resultField: 'state_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'estado_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'filter').addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: ['nome', 'id'],
+    resultField: ['city_name', 'city_id'],
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'dims').addValueToField({
+    name: 'city',
+    table: 'municipio',
+    tableField: 'nome',
+    resultField: 'city_name',
+    where: {
+        relation: '=',
+        type: 'integer',
+        field: 'id'
+    },
+    join: {
+        primary: 'id',
+        foreign: 'municipio_id',
+        foreignTable: 'projecao_matricula'
+    }
+}, 'filter').addValue({
+    name: 'min_year',
+    table: 'projecao_matricula',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '>=',
+        type: 'integer',
+        field: 'ano_censo'
+    }
+}).addValue({
+    name: 'max_year',
+    table: 'projecao_matricula',
+    tableField: 'ano_censo',
+    resultField: 'year',
+    where: {
+        relation: '<=',
+        type: 'integer',
+        field: 'ano_censo'
+    }
+});
+
+enrollmentProjectionApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => {
+    req.sql.field("'Brasil'", 'name')
+    .field('SUM(projecao_matricula.urbano_dia_total)', 'urban_day_total')
+    .field('SUM(projecao_matricula.urbano_noite_total)', 'urban_night_total')
+    .field('SUM(projecao_matricula.rural_dia_total)', 'rural_day_total')
+    .field('SUM(projecao_matricula.rural_noite_total)', 'rural_night_total')
+    .field('projecao_matricula.etapa_ensino_escola_ano_id', 'education_level_school_year_id')
+    .field('projecao_matricula.ano_censo', 'year')
+    .from('projecao_matricula')
+    .group('projecao_matricula.etapa_ensino_escola_ano_id')
+    .group('projecao_matricula.ano_censo')
+    .order('projecao_matricula.ano_censo')
+    .order('projecao_matricula.etapa_ensino_escola_ano_id');
+
+    next();
+}, query, id2str.transform(), response('enrollment_projection'));
+
+module.exports = enrollmentProjectionApp;
\ No newline at end of file