> For the complete documentation index, see [llms.txt](https://docs.blerify.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.blerify.com/es/introduccion-a-la-emision/build/issue-a-w3c-credential.md).

# Emitir una credencial W3C

Esta guía cubre la emisión de una Credencial verificable de W3C de principio a fin. La credencial pasa por el mismo flujo, independientemente de cómo la uses — lo que cambia es si navegas por el Portal o llamas a la API. Elige la pestaña que mejor se adapte a tu forma de trabajar.

{% hint style="info" %}
**Antes de comenzar** necesitas un proyecto con un esquema definido — y, para la ruta de la API, una cuenta de servicio que tenga el `credentials.api` rol. Si eso aún no está configurado, sigue [Empezar](/es/introduccion-a-la-emision/build/get-started.md) primero. Para saber quién de tu equipo puede crear y aprobar credenciales, consulta [Roles y permisos del portal](/es/introduccion/portal-roles-and-permissions.md).
{% endhint %}

***

## Emitir la credencial

{% tabs %}
{% tab title="Portal" %}
Sin código. Ideal para la configuración, las pruebas y la emisión puntual o en lotes pequeños que realiza tu equipo de operaciones.

{% stepper %}
{% step %}

### Crear la credencial

Abre el proyecto desde el que emitirás — cada uno tiene su propio esquema y su propia lista de emisores autorizados, así que lo que puedes crear ya está delimitado para ti. Haz clic en **"Issue Credential"**, completa el formulario de afirmaciones (los campos provienen directamente de tu esquema) y haz clic en **Create**. Blerify lo guarda como borrador con estado `PENDING`. Todavía no se firma nada, así que aún puedes revisarlo o descartarlo.
{% endstep %}

{% step %}

### "Approve"

Revisa el borrador y, cuando los datos estén correctos, haz clic en **"Approve"** — este es el momento de la emisión. Blerify firma y ensambla la credencial y la mueve a `EMITIDA`. A partir de aquí, es evidente cualquier manipulación, así que cualquier edición rompería la firma. Si los datos son incorrectos, recházala en su lugar y vuelve a empezar; una credencial rechazada no puede aprobarse de nuevo.
{% endstep %}

{% step %}

### Entregar al titular

El Portal ofrece tres maneras de entregar la credencial:

* **código QR** — muéstralo o imprímelo; el titular lo escanea con su billetera.
* **Enlace profundo** — envíalo por correo electrónico, SMS o por tu propio canal; al tocarlo se abre la billetera.
* **Notificación push** — si el titular ya tiene la Blerify Wallet instalada y vinculada, envía la credencial directamente hacia ellos.

La billetera valida la firma al llegar y almacena la credencial en el dispositivo del titular.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="API" %}
Control programático total — ideal para volúmenes altos, lotes programados o la emisión activada por eventos de tu propio sistema. Cada solicitud lleva un bearer token de tu cuenta de servicio (consulta [Autenticación](/es/introduccion/authentication.md)), y la cuenta necesita el `credentials.api` rol en el proyecto de destino.

A través de la API, la emisión es **tres llamadas encadenadas**: create devuelve una credencial `_id` y un `signingMessage`; sign convierte ese mensaje en un `firma` y un `publicKey`; assemble usa eso para producir la credencial final.

{% stepper %}
{% step %}

### Crear la credencial

El cuerpo de la solicitud vincula `projectId` y `templateId` que definen el tipo de credencial, los datos del sujeto bajo `additionalData.w3cData`y el `organizationUser` quien la recibirá. Establece `options.approvers` a `true` si la credencial debe ser aprobada por un aprobador designado antes de poder ser firmada.

```bash
curl -X POST \\
  "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials" \\
  -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
        "projectId": "9697f34c-6ba5-4f79-b6dc-0434379d9646",
        "templateId": "6cba8cf5-2d00-4baa-b18a-8797c8c8b550",
        "additionalData": {
          "w3cData": { "email": "ada@example.com", "name": "Ada", "lastname": "Lovelace" }
        },
        "organizationUser": { "email": "ada@example.com" },
        "options": { "approvers": false }
      }'
```

El `201 Created` response incluye el borrador, recortado aquí a los campos que impulsan el flujo:

```json
{
  "_id": "0x412f19b36d6c9a369798415126aec67e...",
  "status": "PENDING",
  "receiver": { "email": "ada@example.com", "repositoryType": "billetera" },
  "signingMessage": "QS8Zs21smjaXmEFRJq7Gfsx2SmzGkg/xBEAXZpg2Rq8="
}
```

Dos valores impulsan el flujo hacia adelante: `_id` es el identificador de credencial que usa cada llamada posterior, y `signingMessage` es sobre lo que opera el paso de firma.

Esquema completo de solicitud y response → [Referencias de la API](https://dev.blerify.com/#beac6de4-d5a1-4bcf-bfbb-9cbae49e4bd1)
{% endstep %}

{% step %}

### Firma la credencial

Envía la `signingMessage` del paso anterior en el cuerpo de la solicitud, con la credencial `_id` en la ruta. Blerify realiza la firma criptográfica y devuelve la `firma`, la firma `algoritmo`y el `publicKey` que lo produjo. Lleva la `firma` y `publicKey` al paso de ensamblaje.

```bash
curl -X PUT \
  "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials/$CREDENTIAL_ID/sign" \
  -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{ "signingMessage": "QS8Zs21smjaXmEFRJq7Gfsx2SmzGkg/xBEAXZpg2Rq8=" }'
```

```json
{
  "signature": "0x1c5d69dcfb39371cb06db1388c815fb...",
  "algorithm": "ecdsa-jcs-2019",
  "publicKey": "0xd7650261601924be00f2abd2958..."
}
```

Esquema completo de solicitud y response → [Referencias de la API](https://dev.blerify.com/#2b542712-0052-44d3-a3bf-1580e1d74e17)
{% endstep %}

{% step %}

### Ensambla la credencial

Este paso convierte una firma en una credencial. Firma comprobada *quién* está respaldando los datos; ensambla esa prueba en la Credencial Verificable W3C final — el objeto que una billetera puede contener y un verificador puede comprobar. Envía la `templateId` para tu proyecto junto con la `firma` y `publicKey` del paso anterior. Observa la `keystore=keyvault` parámetro de consulta.

```bash
curl -X PUT \
  "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials/$CREDENTIAL_ID/assemble?keystore=keyvault" \
  -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
        "templateId": "6cba8cf5-2d00-4baa-b18a-8797c8c8b550",
        "signature": "0x1c5d69dcfb39371cb06db1388c815fb...",
        "publicKey": "0xd7650261601924be00f2abd2958..."
      }'
```

La respuesta es la credencial completa y firmada (recortada aquí por legibilidad):

```json
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://vc.blerify.com/education/EducationCredential"
  ],
  "type": ["VerifiableCredential", "EducationCredential"],
  "id": "2b94c494-e402-4afd-9bd5-5ffc628efe41",
  "emisor": "did:lac1:1APgL8Z9V4bRQ...",
  "issuanceDate": "2026-02-23T16:14:54.944089Z",}
  "credentialSubject": {
    "id": "did:lac1:1iT4pJXCP5YJhP...", 
    "subjectName": "Ada Lovelace", 
    "title": "Introducción a la criptografía",
    "date": "2026-02-23"
  },
  "proof": [
    {
      "type": "DataIntegrityProof",
      "cryptosuite": "ecdsa-jcs-2019",
      "verificationMethod": "did:lac1:1APgL8Z9V4bRQ...#2orwtrQ29...", 
      "proofPurpose": "assertionMethod",
      "proofValue": "zZtk1zBQuzY5qRQWC1sAUd..."
    }
  ]
}
```

Esquema completo de solicitud y response → [Referencias de la API](https://dev.blerify.com/#644f3927-2fa5-452c-8def-133c5e46281b)
{% endstep %}

{% step %}

### Entregar al titular

Assemble te entrega la Credencial verificable terminada — ahora llévala al titular. Entrégala como un código QR, un enlace profundo o una notificación push, exactamente como lo hace el Portal. La billetera valida la firma al llegar y almacena la credencial en el dispositivo del titular. Si alguna entrega se pierde, [Gestionar una credencial](/es/introduccion-a-la-emision/build/manage-a-credential.md) cubre el reenvío.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="API (cuenta de servicio, automatizado)" %}
Si tu backend emite credenciales en nombre de una organización sin un paso de aprobación humana — por ejemplo, un LMS que emite credenciales automáticamente cuando un estudiante completa un curso — el flujo es una variante simplificada: crea la credencial, apruébala directamente como la cuenta de servicio y haz consultas periódicas hasta que esté lista.

Esto requiere una cuenta de servicio con el `credentials.api` rol. La autenticación sigue el mismo `private_key_jwt` patrón descrito en [Autenticación](/es/introduccion/authentication.md).

{% stepper %}
{% step %}

### Crear la credencial

Envía la plantilla, los datos del asunto y la identidad del destinatario. La cuenta de servicio crea el borrador en nombre de la organización.

```bash
curl -X POST \\
  "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials" \\
  -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
        "templateId": "your-template-id",
        "additionalData": {
          "w3cData": {
            "fullname": "Your Recipient",
            "metadata": { "level": 1 }
          }
        },
        "organizationUser": {
          "email": "recipient@example.com"
        },
        "options": { "omitApproval": false, "approvers": true }
      }'
```

El `201` la response incluye `_id` — consérvalo para los pasos a continuación.

Esquema completo de solicitud y response → [Referencias de la API](https://dev.blerify.com/#01cf28b2-23f9-472d-a822-ab8cc0ce0114)
{% endstep %}

{% step %}

### Aprobar (firmar) la credencial

Aprobar como una cuenta de servicio registra la aprobación y activa la emisión de forma asíncrona. Incluye `keystore=keyvault` y un `lang` parámetro de consulta para el idioma del receptor.

```bash
curl -X PUT \
  "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials/$CREDENTIAL_ID/sign?keystore=keyvault&lang=en" \
  -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{ "templateId": "your-template-id" }'
```

Una `200` response significa que la aprobación se registró y se activó la firma — **no** que la credencial está lista. Confirma el resultado mediante sondeos.
{% endstep %}

{% step %}

### Sondea hasta que se emita

Sondea la credencial hasta que `status` es `SENT`. El `templateId` parámetro de consulta es obligatorio — el acceso está acotado a la organización, el proyecto y la plantilla.

```bash
curl "https://api.blerify.com/api/v1/organizations/$ORG/projects/$PROJECT/credentials/$CREDENTIAL_ID/polling?templateId=$TEMPLATE_ID" \
  -H "Authorization: Bearer $TOKEN"
```

Durante la emisión:

```json
{ "_id": "0x8f3a...c1", "status": "PENDING", "pdf": null, "thumbnail": null, "code": null }
```

Cuando esté listo:

```json
{
  "_id": "0x8f3a...c1",
  "status": "SENT",
  "pdf": "https://storage.../credential.pdf?signature=...",
  "thumbnail": "https://storage.../thumbnail.png?signature=...",
  "code": "abC12XyZ..."
}
```

| Campo              | Usa                                                                                                                                                        |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `status`           | Consulta periódicamente hasta `SENT`. La credencial pasa a `DELIVERED` una vez que el titular la reclame.                                                  |
| `pdf`, `thumbnail` | URLs firmadas de corta duración. Obtenlas o muéstralas inmediatamente después de consultar periódicamente, o vuelve a consultar para obtener otras nuevas. |
| `code`             | El código de reclamación. Úsalo para crear el código QR que el titular escanea para reclamar la credencial en su billetera.                                |

Consulta periódicamente en un intervalo razonable y establece un tiempo de espera; si la credencial no ha alcanzado `SENT` después de un período razonable, considéralo una falla y verifica si hay errores.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
**Una credencial firmada no se puede editar.** Si los datos resultan ser incorrectos después de que se `EMITIDA`, revoca la original y emite una nueva; la revocación es inmediata y permanente, sin posibilidad de deshacerla. Consulta [Gestionar una credencial](/es/introduccion-a-la-emision/build/manage-a-credential.md).
{% endhint %}

***

## Qué sucede después

Una vez que una credencial está firmada y entregada, tiene vida propia: puede ser aceptada, mantenida, revocada o dejarse expirar. Esos estados y cómo mover una credencial entre ellos se explican por separado:

* [**Ciclo de vida de la credencial**](/es/introduccion-a-la-emision/learn/credential-lifecycle.md) — todos los estados que puede tener una credencial y por qué solo avanza.
* [**Gestionar una credencial**](/es/introduccion-a-la-emision/build/manage-a-credential.md) — poner una credencial en espera, revocarla o reenviar la entrega.
* [**Manejar errores**](/es/introduccion-a-la-emision/build/handle-errors.md) — los casos de falla que encontrarás y cómo recuperarte de cada uno.

***

## Próximos pasos

[**Gestionar una credencial**](/es/introduccion-a-la-emision/build/manage-a-credential.md) — la continuación natural: qué hacer después de que una credencial esté en circulación.

Ver también: [Confianza y firma](/es/introduccion-a-la-emision/learn/trust-and-signing.md) — por qué la credencial que acabas de firmar es confiable sin un callback · [Referencias de la API](https://dev.blerify.com/#01cf28b2-23f9-472d-a822-ab8cc0ce0114) — los contratos completos del endpoint.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.blerify.com/es/introduccion-a-la-emision/build/issue-a-w3c-credential.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
