---
title: "Curriculums"
description: "How to create digital curriculums in Digiploma: the signed XML and its RVCE, signatures in Lacuna Signer, prerequisites and publication."
canonical: "https://docs.lacunasoftware.com/en-us/articles/digiploma/api/curriculums"
locale: "en"
product: "Digiploma"
last_updated: "2026-10-11"
---

# Curriculums

The digital curriculum (*currículo escolar digital*), defined by Instrução Normativa SESU nº 2, describes the curricular structure of a
course: its curricular units, tags, areas and completion criteria. Digiploma generates the signed XML and its visual representation, the
**RVCE**, collects the signatures in Lacuna Signer and publishes the curriculum for validation. Academic transcripts refer to a curriculum by
its code (`historicoEscolar.codigoCurriculo`).

## Before you start

* The organization must be an issuer (type **Emissora** or **Emissora e Registradora**) (`SubscriptionOperationNotAllowed`).
* The Signer API key must be set in the organization's **Configurações** (Settings) (`SignerApiKeyNotSet`).
* You need a curriculum [template](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/templates-and-flows#templates).
* You need the signers: a saved [signature flow](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/templates-and-flows#signature-flows) of type `Curriculum`, or the signers inline in
  each request.

## Create a curriculum

`POST /api/curriculums` creates one curriculum. To create many from a JSON file, use a [batch](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/batches).

```json
{
  "templateId": "b3e1…",
  "documentFlowId": "e90d…",
  "curriculum": {
    "codigo": "ADM-2024",
    "dataCurriculo": "2024-01-15",
    "minutosRelogioDaHoraAula": 50,
    "dadosCurso": { … },
    "iesEmissora": { … },
    "etiquetas": [ { "codigo": "ob", "nome": "Obrigatória" } ],
    "areas": [ … ],
    "estruturaCurricular": { … },
    "criteriosIntegralizacao": [ … ]
  }
}
```

| Field | Required | Description |
|---|---|---|
| `templateId` | Yes | The curriculum template. |
| `curriculum` | Yes | The data: the institution's curriculum code (`codigo`), the approval date (`dataCurriculo`, today by default), the minutes in a class hour (`minutosRelogioDaHoraAula`), the course (`dadosCurso`), the institution (`iesEmissora`), at least one tag (`etiquetas`), the areas, the curricular structure (`estruturaCurricular`), at least one completion criterion (`criteriosIntegralizacao`) and, optionally, the complementary activities and additional information. |
| `documentFlowId` / `documentFlow` | One of the two | The signers. Only `curriculumFlow` may be filled, with **exactly one** institutional signature (e-CNPJ) (`DocumentFlowCurriculumOnlyOneCompanySignatureAllowed`). |
| `newFolderName` / `signerFolderId` | No | The Signer folder for the document, new or existing. |

A complete example of the data is in the [JSON sample file](https://www.digiploma.com.br/assets/files/curriculum-template.json).

The course coordinators (e-CPF) sign first, in a step named *Coordenação do curso*, and the institution signs last, in a step named
*Instituição*.

The response is `{success, id, errors}`. Generation failures return **HTTP 200** with `"success": false` and the processing log in
`errors`; that includes `CurriculumCodeAlreadyExists`, when another curriculum of the organization that is not canceled has the same
`codigo`. See [Creation results](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#creation-results).

## Statuses and cancellation

| `status` | Meaning |
|---|---|
| `Created` | Created; waiting for signatures. |
| `Active` | Signed: the curriculum is valid. |
| `Canceled` | Canceled. |

`POST /api/curriculums/{id}/cancellation`, with a `reason` of up to 500 characters, cancels a curriculum. Cancellation is permanent: there is
no suspension or restore. If the curriculum is not signed yet, its document is deleted from Signer. Once canceled, its `codigo` can be used
by a new curriculum.

## Download the files

| Document | Base64 | Ticket | Direct download | Available when |
|---|---|---|---|---|
| Signed XML | `GET /{id}/xml-b64` | `GET /{id}/xml-ticket` | `GET /{id}/xml` | The curriculum is `Active` (`CurriculumNotValid`). For a ticket, checked when it is downloaded. |
| RVCE | `GET /{id}/visual-representation-b64` | `GET /{id}/visual-representation-ticket` | — | Always. |

All paths are relative to `/api/curriculums`. See [Downloads and tickets](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#downloads-and-tickets).

## Replace the visual representation

`POST /api/curriculums/{id}/visual-representation` replaces the RVCE of a curriculum that is not canceled, from another curriculum template
(`templateId`) or from an [uploaded](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#uploads) PDF in portrait orientation (`uploadId`). The signed XML is not affected. It requires
the `UpdateDocumentVisualRepresentation` permission (**Administrador** and **Gerente** roles).

## Read and search

* `GET /api/curriculums/{id}` returns the curriculum; `GET /api/curriculums/{id}/history` returns its status changes, newest first.
* `GET /api/curriculums` returns a page of curriculums. Besides the [paging parameters](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#pagination), it filters by `Status`,
  `BatchId`, creation date (`StartDateUtc` inclusive, `EndDateUtc` exclusive) and `Q` (curriculum code, course or institution name).
  Results are sorted by update date.

## Validate a curriculum

* `GET /api/curriculums/codes/{code}` validates a curriculum of your own organization, with the API key.
* `GET /api/curriculums/{code}/validation` is the **public** validation. See [Public validation](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/validation).

## Webhooks

| Event | When |
|---|---|
| `CurriculumCreated` | The curriculum was created. |
| `CurriculumConcluded` | The curriculum was signed. |
| `CurriculumCanceled` | The curriculum was canceled. |

See [Webhooks](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/webhooks) for the payloads.

## Operation reference

| Operation | Description |
|---|---|
| `POST /api/curriculums` | Create a curriculum |
| `GET /api/curriculums` | List curriculums |
| `GET /api/curriculums/{id}` | Get a curriculum |
| `GET /api/curriculums/{id}/history` | Get the status history |
| `POST /api/curriculums/{id}/cancellation` | Cancel a curriculum |
| `GET /api/curriculums/{id}/xml`, `…/xml-b64`, `…/xml-ticket` | Download the signed XML |
| `GET /api/curriculums/{id}/visual-representation-b64`, `…/visual-representation-ticket` | Download the RVCE |
| `POST /api/curriculums/{id}/visual-representation` | Replace the RVCE |
| `GET /api/curriculums/codes/{code}` | Validate a curriculum of your organization |
| `GET /api/curriculums/{code}/validation`, `…/validation/visual-representation`, `…/validation/xml` | [Public validation](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/validation) |
