---
title: "Issue diplomas (issuer only)"
description: "How issuer-only institutions create emissions in Digiploma: academic documentation XML, issuer signatures and the diploma XML returned by the registrar."
canonical: "https://docs.lacunasoftware.com/en-us/articles/digiploma/api/emissions"
locale: "en"
product: "Digiploma"
last_updated: "2026-10-11"
---

# Issue diplomas (issuer only)

This page is for institutions that **issue** diplomas and have them registered by another institution, the registrar. The organization
must be of type **Emissora** (issuer) or **Emissora e Registradora**.

An **emission** (*emissão*) is the issuer's side of a diploma:

1. Digiploma generates the **academic documentation XML** from your data, and collects the issuer's signatures in Lacuna Signer.
1. The signed XML goes to the registrar, which registers the diploma and signs the **diploma XML**.
1. The diploma XML comes back, and Digiploma creates the **diploma**, with its visual representation (RVDD) and its final academic
   transcript.

## How the registrar receives the emission

The `registrationType` of each emission decides how steps 2 and 3 happen:

| `registrationType` | How it works |
|---|---|
| `Manual` | Outside Digiploma. You download the signed academic documentation XML, send it to the registrar, and later [upload the diploma XML](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/emissions#complete-the-emission-with-the-diploma-xml) the registrar sends back. |
| `Subscription` | The registrar is another organization in the same Digiploma instance (*registradora credenciada*). The request goes to it automatically, you follow its progress on the emission, and the diploma is created when it is registered. The partnership between the two organizations is set up by the instance administrator; `registryId` is the registrar organization's id. |
| `Integration` | The registrar uses another Digiploma instance. It works like `Subscription`, between separate applications, for example `diplomas.issuer.edu.br` and `diplomas.registrar.edu.br`. Both institutions configure the integration in their organization settings first, exchanging API keys. |

To register the diplomas yourself, in the same organization, see [Issue and register](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/degrees) instead.

## Before you start

* The Signer API key must be set in the organization's **Configurações** (Settings) (`SignerApiKeyNotSet`).
* You need an **academic transcript template**, for the final transcript generated when the diploma is registered, and optionally a
  **diploma template**: without one, the diploma has no RVDD. See [Templates](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 `Emission`, or the signers inline in
  each request.
* For `Subscription`, the partnership with the registrar (`EmisionForbiddenRegistry` otherwise); for `Integration`, the integration with
  the registrar's instance (`IntegrationRegistryNotFound`, `IntegrationRegistryInvalid`).

## Create an emission

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

```json
{
  "registrationType": "Manual",
  "templateId": "0f8b1c2e-…",
  "academicTranscriptTemplateId": "6a1d9e44-…",
  "documentFlowId": "c2f0e7a1-…",
  "emission": {
    "degreeType": "Default",
    "dadosDiploma": { "diplomado": { … }, "dadosCurso": { … }, "iesEmissora": { … }, "dataConclusao": "2026-06-30", … },
    "documentacaoAcademica": {
      "registro": { "dadosPrivadosDiplomado": { … }, "termoResponsabilidade": { … }, "documentacaoComprobatoria": [ … ] }
    }
  }
}
```

| Field | Required | Description |
|---|---|---|
| `registrationType` | Yes | `Manual`, `Subscription` or `Integration` (see above). |
| `registryId` | For `Subscription` | The registrar organization. |
| `emission` | Yes | The MEC data: `dadosDiploma` and `documentacaoAcademica.registro` (the graduate's private data, the statement of responsibility and the supporting documents, as Base64 PDF/A files), plus `degreeType` and `visualRepresentationFieldsContent`, as in [Issue and register](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/degrees#create-a-diploma). There is no `dadosRegistro`: the registrar provides it. |
| `academicTranscriptTemplateId` | Yes | The academic transcript template. |
| `templateId` | No | The diploma template. Without it, the diploma has no RVDD. |
| `documentFlowId` / `documentFlow` | One of the two | The signers. Only `issuingFlow` (the issuer's representatives with e-CPF and the issuer itself with e-CNPJ) and `academicTranscriptFlow` may be filled (`DocumentFlowInvalidEmissionData`). |
| `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/emission-json-template3.json).

The response is `{success, id, errors}`. As with the other creation operations, generation failures, such as data rejected by the MEC XML
schema, return **HTTP 200** with `"success": false` and the processing log in `errors`. See [Creation results](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#creation-results).

## Statuses

| `status` | Meaning |
|---|---|
| `Created` | Created; waiting for the issuer's signatures. |
| `Signed` | The academic documentation XML is signed. |
| `SentToRegistry` | Sent to the registrar (`Subscription` and `Integration`). |
| `AcceptedByRegistry` | The registrar accepted the request, when its instance requires acceptance. |
| `Registered` | The diploma XML was received: the diploma exists. |
| `Canceled` | Canceled, by the issuer or because the registrar rejected or canceled the request. |

With `Subscription` and `Integration`, `GET /api/emissions/{id}` also shows the registrar's side: `registryName`, `registrationStatus`,
`registrationStatusDescription` and `registrationUpdateDate`.

## Get the academic documentation XML

`GET /api/emissions/{id}/academic-documentation-ticket` returns a [ticket](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#downloads-and-tickets) to download the signed
academic documentation XML. The download fails with `DegreeAcademicDocumentationNotSigned` until it is signed. With `registrationType`
`Manual`, this is the file you send to the registrar.

## Complete the emission with the diploma XML

With `registrationType` `Manual`, complete the emission when the registrar sends back the signed diploma XML:

1. [Upload](https://docs.lacunasoftware.com/en-us/articles/digiploma/api#uploads) the XML file with `POST /api/uploads` or `POST /api/uploads/bytes`.
1. Call `POST /api/emissions/{id}/degree-xml` with the upload:

    ```json
    { "id": "5d3b…", "name": "diploma.xml", "contentType": "application/xml" }
    ```

The emission must be `Signed`, `SentToRegistry` or `AcceptedByRegistry` (`EmissionInvalidStatus`); calling it again for a `Registered`
emission does nothing. Digiploma then checks that:

* the XML is the diploma of **this** emission: its `IdDocumentacaoAcademica` must match the academic documentation generated for it
  (`EmissionInvalidIdDocumentacaoAcademica`);
* the data follows the MEC rules and the XML schema;
* the signatures are complete: the issuer's representatives and e-CNPJ on `DadosDiploma`, the registrar's representatives on
  `DadosRegistro`, matching the signers listed in the XML, and the registrar's archiving signature (e-CNPJ, AD-RA policy) on the whole file.

The response is `{success, errors, structureErrors, signatureErrors}`. A file that fails these checks returns **HTTP 200** with
`"success": false`, and the problems listed in the three arrays.

When the file is accepted, the emission becomes `Registered` and Digiploma creates the **diploma**, already `Active`, with its RVDD if the
emission has a diploma template. `GET /api/emissions/{id}` returns its `degreeId` and `degreeVerificationCode`, and from then on it is
managed with the [Degrees API](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/degrees#read-diplomas). Digiploma also generates the final [academic transcript](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/academic-transcripts),
except for a second copy or a judicial-decision diploma.

With `Subscription` and `Integration`, this step happens automatically when the registrar's diploma XML is signed.

## Cancel an emission

`POST /api/emissions/{id}/cancellation`, with a `reason` of up to 500 characters, cancels an emission that is `Created` or `Signed`. If the
document is not signed yet, it is deleted from Signer. Once the emission has been sent to the registrar, only the registrar can reject or
cancel it (`EmissionCannotBeCanceled`). To annul a diploma that already exists, change the [diploma's status](https://docs.lacunasoftware.com/en-us/articles/digiploma/api/degrees#annul-suspend-or-restore-a-diploma).

## Read and search

* `GET /api/emissions/{id}` returns the emission; `GET /api/emissions/{id}/information` returns its public data (`dadosDiploma`), read
  from the academic documentation XML.
* `GET /api/emissions/{id}/history` returns the status changes, newest first.
* `GET /api/emissions` returns a page of emissions. 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), `IsSigned=true` and `Q` (student's CPF, name or social
  name, or course). Results are sorted by update date.

## Webhooks

| Event | When |
|---|---|
| `EmissionCreated` | The emission was created. |
| `EmissionSigned` | The academic documentation XML was signed. |
| `EmissionSentToRegistry` | The emission was sent to the registrar. |
| `EmissionRegistrationAccepted`, `EmissionRegistrationApproved`, `EmissionRegistrationRegistered` | The registrar accepted, approved or registered the request (`Subscription` and `Integration`). |
| `EmissionRegistrationRejected`, `EmissionRegistrationCanceled` | The registrar rejected or canceled the request. The emission becomes `Canceled`, and `EmissionCanceled` is **not** sent. |
| `EmissionRegistered` | The diploma XML was accepted. The payload carries the `degreeId`. |
| `EmissionCanceled` | The issuer canceled the emission. |

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

## Operation reference

| Operation | Description |
|---|---|
| `POST /api/emissions` | Create an emission |
| `GET /api/emissions` | List emissions |
| `GET /api/emissions/{id}` | Get an emission |
| `GET /api/emissions/{id}/information` | Get the public data of an emission |
| `GET /api/emissions/{id}/history` | Get the status history |
| `GET /api/emissions/{id}/academic-documentation-ticket` | Download the signed academic documentation XML |
| `POST /api/emissions/{id}/degree-xml` | Complete the emission with the diploma XML |
| `POST /api/emissions/{id}/cancellation` | Cancel an emission |
