Skip to main contentCertyo Developer Portal

Integración con Microsoft Power Automate

Construye flujos low-code con un conector personalizado de Certyo que se activa con cambios en Dynamics 365, subidas a SharePoint y eventos SQL para anclar registros en la blockchain.


Descripción general

Microsoft Power Automate permite a desarrolladores ciudadanos y equipos de integración conectar Certyo con más de 1.000 servicios de Microsoft y terceros usando un constructor visual de flujos. Esta guía cubre la creación de un conector personalizado de Certyo desde una definición OpenAPI y la construcción de tres plantillas de flujo listas para producción.

El conector personalizado envuelve el REST API de Certyo como un recurso de primera clase de Power Platform, dando a los autores de flujos acceso a la ingesta de registros, operaciones en lote y verificación sin escribir código.

Requisitos previos

  • Power Automate Premium ($15/usuario/mes) — requerido para conectores personalizados y triggers premium
  • Clave API de Certyo (obtener de la Guía de inicio rápido)
  • Acceso al centro de administración de Power Platform para el registro del conector
  • Tenant de Azure Active Directory (para la configuración de autenticación del conector)
  • Acceso al sistema fuente: Dynamics 365, SharePoint o Azure SQL según tu flujo

Arquitectura

Power Automate Integration Architecturebash
┌──────────────────────────────────────────────────────────────────┐
│                     TRIGGER SOURCES                              │
│  ┌──────────────┐  ┌──────────────┐  ┌────────────────────────┐ │
│  │ Dynamics 365 │  │  SharePoint  │  │    Azure SQL / SQL     │ │
│  │ Dataverse    │  │  Document    │  │    Server Change       │ │
│  │ Row Changed  │  │  Uploaded    │  │    Tracking            │ │
│  └──────┬───────┘  └──────┬───────┘  └────────────┬───────────┘ │
│         └─────────────────┼───────────────────────┘             │
├───────────────────────────┼──────────────────────────────────────┤
│                   POWER AUTOMATE FLOW                            │
│  ┌────────────────────────┴────────────────────────────────┐    │
│  │  1. Trigger fires on source system event                │    │
│  │  2. Compose: build Certyo record JSON                   │    │
│  │  3. Custom Connector: POST /api/v1/records              │    │
│  │  4. Condition: check 202 Accepted                       │    │
│  │  5. Update source record with recordHash                │    │
│  └────────────────────────┬────────────────────────────────┘    │
├───────────────────────────┼──────────────────────────────────────┤
│                   CERTYO PIPELINE                                │
│  ┌────────────────────────┴────────────────────────────────┐    │
│  │  POST /api/v1/records  ──►  202 Accepted + recordHash   │    │
│  │         │                                                │    │
│  │    Kafka topic  ──►  Accumulate  ──►  Merkle tree       │    │
│  │         ──►  IPFS pin  ──►  Polygon anchor              │    │
│  │                                                          │    │
│  │  ~60-90 seconds to on-chain confirmation                 │    │
│  └──────────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────────┘

Configuración del conector personalizado

Los conectores personalizados de Power Automate se definen desde una especificación OpenAPI (Swagger). Sigue estos pasos para registrar el conector de Certyo en tu entorno de Power Platform.

Paso 1: Crear el conector

  1. Ve a Power Automate > Datos > Conectores personalizados > Nuevo conector personalizado > Importar un OpenAPI desde URL
  2. Introduce un nombre: Certyo Records API
  3. Pega la URL de tu especificación OpenAPI alojada, o sube la definición JSON a continuación

Paso 2: Configurar autenticación

  1. En la pestaña Seguridad , selecciona API Key
  2. Etiqueta del parámetro: API Key
  3. Nombre del parámetro: X-API-Key
  4. Ubicación del parámetro: Header

Paso 3: Probar el conector

  1. Crea una nueva conexión usando tu clave API de Certyo
  2. Selecciona la operación IngestRecord
  3. Rellena valores de prueba y verifica que recibes una respuesta 202 Accepted

Ejemplos de código

certyo-connector-openapi.json — Custom Connector Definitionjson
{
  "openapi": "3.0.1",
  "info": {
    "title": "Certyo Records API",
    "description": "Blockchain-backed record ingestion, verification, and query for the Certyo durable records platform.",
    "version": "1.0.0",
    "contact": {
      "name": "Certyo Developer Support",
      "url": "https://www.certyos.com/developers"
    }
  },
  "servers": [
    {
      "url": "https://www.certyos.com"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/api/v1/records": {
      "post": {
        "operationId": "IngestRecord",
        "summary": "Ingest a single record for blockchain anchoring",
        "description": "Accepts a record and returns 202 with a record hash. The record flows through the accumulation pipeline and is anchored on Polygon within ~60-90 seconds.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IngestRecordRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Record accepted for processing",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IngestRecordResponse"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "QueryRecords",
        "summary": "Query records by tenant and record ID",
        "parameters": [
          {
            "name": "tenantId",
            "in": "query",
            "required": true,
            "schema": { "type": "string" }
          },
          {
            "name": "recordId",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching records"
          }
        }
      }
    },
    "/api/v1/records/bulk": {
      "post": {
        "operationId": "BulkIngestRecords",
        "summary": "Ingest up to 1000 records in a single request",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIngestRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Bulk records accepted"
          }
        }
      }
    },
    "/api/v1/verify/record": {
      "post": {
        "operationId": "VerifyRecord",
        "summary": "Verify a record against its on-chain Merkle proof",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyRecordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Verification result"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "name": "X-API-Key",
        "in": "header"
      }
    },
    "schemas": {
      "IngestRecordRequest": {
        "type": "object",
        "required": ["tenantId", "database", "collection", "recordId", "recordPayload"],
        "properties": {
          "tenantId": { "type": "string", "description": "Your tenant identifier" },
          "database": { "type": "string", "description": "Logical source database or system" },
          "collection": { "type": "string", "description": "Logical table or collection" },
          "recordId": { "type": "string", "description": "Unique record identifier" },
          "recordVersion": { "type": "string", "default": "1" },
          "operationType": { "type": "string", "enum": ["insert", "update", "delete", "upsert"], "default": "upsert" },
          "recordPayload": { "type": "object", "description": "The record data as arbitrary JSON" },
          "sourceTimestamp": { "type": "string", "format": "date-time" },
          "idempotencyKey": { "type": "string", "description": "Deduplication key (24h window)" }
        }
      },
      "IngestRecordResponse": {
        "type": "object",
        "properties": {
          "recordId": { "type": "string" },
          "recordHash": { "type": "string" },
          "tenantId": { "type": "string" },
          "acceptedAt": { "type": "string", "format": "date-time" },
          "idempotencyReplayed": { "type": "boolean" }
        }
      },
      "BulkIngestRequest": {
        "type": "object",
        "required": ["tenantId", "records"],
        "properties": {
          "tenantId": { "type": "string" },
          "records": {
            "type": "array",
            "maxItems": 1000,
            "items": { "$ref": "#/components/schemas/IngestRecordRequest" }
          }
        }
      },
      "VerifyRecordRequest": {
        "type": "object",
        "required": ["tenantId", "database", "collection", "recordId", "payload"],
        "properties": {
          "tenantId": { "type": "string" },
          "database": { "type": "string" },
          "collection": { "type": "string" },
          "recordId": { "type": "string" },
          "payload": { "type": "object" }
        }
      }
    }
  }
}

Plantillas de flujo

A continuación se presentan tres patrones de flujo listos para producción. Cada uno puede crearse en el diseñador visual de Power Automate o importarse como una definición JSON.

Flujo 1: Cambio de registro en Dynamics 365

Se activa cuando se modifica una fila de pedido de venta en Dataverse. El flujo compone un registro Certyo, lo ingesta y escribe el recordHash de vuelta en una columna personalizada de la entidad D365 para trazabilidad.

  • Trigger: Cuando se agrega o modifica una fila (conector Dataverse)
  • Filtro: statecode eq 1 (solo pedidos confirmados)
  • Acción 1: Compose — construir JSON de registro Certyo desde las salidas del trigger
  • Acción 2: Certyo Custom Connector — IngestRecord
  • Acción 3: Actualizar fila — escribir recordHash y acceptedAt de vuelta en D365
  • Ruta de error: En caso de fallo, componer detalles del error para monitoreo

Flujo 2: Subida de documento a SharePoint

Se activa cuando un documento se sube a una biblioteca de SharePoint. El flujo extrae metadatos del documento y el hash de contenido, luego los ingesta en Certyo para seguimiento de autenticidad de documentos.

  • Trigger: Cuando se crea un archivo (conector SharePoint)
  • Acción 1: Obtener propiedades del archivo — recuperar metadatos del documento
  • Acción 2: Obtener contenido del archivo — calcular hash SHA-256 del archivo
  • Acción 3: Conector personalizado Certyo — IngestRecord con metadatos del documento y hash de contenido en recordPayload
  • Acción 4: Actualizar propiedades del archivo — almacenar el recordHash de Certyo en una columna personalizada de SharePoint

Flujo 3: Verificación programada

Se ejecuta según un horario (por ejemplo, diariamente) para verificar que los registros ingestados recientemente se han anclado exitosamente en la blockchain.

  • Trigger: Recurrencia — cada 24 horas
  • Acción 1: Conector personalizado Certyo — QueryRecords con filtro tenantId
  • Acción 2: Aplicar a cada uno — iterar sobre registros con estado Batched
  • Acción 3: Conector personalizado Certyo — VerifyRecord para cada uno
  • Acción 4: Condición — si la verificación falla, enviar un correo de alerta a través del conector Outlook 365

Autenticación

El conector personalizado utiliza autenticación por API Key. Cuando un usuario crea una conexión al conector Certyo en Power Automate, ingresa su clave API de Certyo una vez. La plataforma la almacena de forma segura y la adjunta como el encabezado X-API-Key en cada solicitud.

  • Conexiones por usuario: Cada autor de flujo crea su propia conexión con su clave API. Esto permite pistas de auditoría por usuario en Certyo.
  • Conexión de cuenta de servicio: Para flujos automatizados (programados, dirigidos por eventos), usa una clave API de cuenta de servicio dedicada de Certyo. Comparte la conexión con los propietarios del flujo.
  • Rotación de claves: Al rotar claves API, actualiza la conexión en Power Automate > Datos > Conexiones. Los flujos activos tomarán la nueva clave automáticamente.

Certificación del conector

Para hacer que el conector Certyo esté disponible en la galería pública de conectores de Power Platform (visible para todos los usuarios de Power Automate en todo el mundo), sigue el proceso de certificación de Microsoft:

  1. Enviar para revisión: Usa el comando CLI paconn submit del SDK de Microsoft Power Platform Connectors
  2. Documentación: Proporciona un README del conector, icono (160x160 PNG) y descripciones de parámetros de conexión
  3. Pruebas: Microsoft requiere credenciales de prueba funcionales y un flujo de demostración para la validación
  4. SLA: El conector debe cumplir los requisitos de fiabilidad de API de Microsoft (99,9% de disponibilidad, tiempos de respuesta inferiores a 3s)
  5. Plazo: La certificación normalmente toma de 2 a 4 semanas después del envío

Limitación y límites

Power Automate aplica límites de ejecución que afectan cómo diseñas los flujos de integración con Certyo:

  • 600 acciones por ejecución de flujo — Una ejecución de flujo que procesa 500 registros en un bucle "Aplicar a cada uno" usa al menos 500 acciones (una por iteración) más acciones de configuración. Mantente bajo el límite o divide en subflujos.
  • 100.000 acciones por 24 horas — Límite diario por usuario en todos los flujos. La ingesta de alto volumen debe usar la operación BulkIngestRecords para agrupar hasta 1.000 registros por acción.
  • Concurrencia del conector: Los conectores personalizados tienen por defecto 1 solicitud concurrente. Aumenta a través de la pestaña General del conector en el editor de conectores personalizados, hasta un máximo de 50 conexiones concurrentes.
  • Política de reintentos: Power Automate reintenta acciones HTTP fallidas hasta 4 veces con backoff exponencial. El idempotencyKey de Certyo garantiza reintentos seguros.
Power Automate Premium
Power Automate Premium ($15/usuario/mes) incluye todos los conectores premium, RPA de escritorio (Power Automate Desktop), créditos de AI Builder y soporte para conectores personalizados. El conector personalizado de Certyo requiere el nivel Premium — no funcionará en los planes gratuitos o por flujo.

AI Integration · v1.0.0

AI Integration Skill

Download a skill file that enables AI agents to generate working Power Automate + Certyo integration code for any language or framework.

v1.0.0
What is this?
A markdown file containing Power Automate-specific field mappings, authentication setup, code examples, and integration patterns for Certyo. Drop it into your AI agent's context and ask it to generate integration code.

What's inside

  • Autenticación — Conector personalizado con autenticación API Key y configuración del nivel Premium
  • Arquitectura — Trigger D365/SharePoint/SQL → Conector personalizado Certyo → API de registros
  • Especificación del conector — Definición OpenAPI 3.0 para importar en Power Platform
  • Plantillas de flujo — Cambio de registro D365, subida de documento SharePoint, verificación programada
  • Certificación — Ruta hacia el conector certificado de Microsoft para la galería pública
  • Limitación — Límites de 600 acciones/flujo/ejecución y patrones de diseño eficiente de flujos

How to use

Claude Code

Place the file in your project's .claude/commands/ directory, then use it as a slash command:

# Download the skill file
mkdir -p .claude/commands
curl -o .claude/commands/certyo-powerautomate.md \
  https://www.certyos.com/developers/skills/certyo-powerautomate-skill.md

# Use it in Claude Code
/certyo-powerautomate "Genera un flujo de Power Automate que envíe cambios de registros D365 a Certyo"

Cursor / Copilot / Any AI Agent

Add the file to your project root or attach it to a conversation. The AI agent will use the Power Automate-specific patterns, field mappings, and code examples to generate correct integration code.

# Add to your project
curl -o CERTYO_POWERAUTOMATE.md \
  https://www.certyos.com/developers/skills/certyo-powerautomate-skill.md

# Then in your AI agent:
"Using the Certyo Power Automate spec in CERTYO_POWERAUTOMATE.md,
 genera un flujo de power automate que envíe cambios de registros d365 a certyo"

CLAUDE.md Context File

Append the skill file to your project's CLAUDE.md so every Claude conversation has Power Automate + Certyo context automatically.

# Append to your project's CLAUDE.md
echo "" >> CLAUDE.md
echo "## Certyo Power Automate Integration" >> CLAUDE.md
cat CERTYO_POWERAUTOMATE.md >> CLAUDE.md