From 8e27ea0d875806f18391233a438ec3ff65167814 Mon Sep 17 00:00:00 2001 From: JavierInfini Date: Fri, 22 May 2026 13:50:48 +0200 Subject: [PATCH 1/2] Add README for Infini Analytics connector Added detailed documentation for the Infini Analytics connector, including prerequisites, authentication, supported operations, and getting started guide. --- .../InfiniAnalytics/README.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 certified-connectors/InfiniAnalytics/README.md diff --git a/certified-connectors/InfiniAnalytics/README.md b/certified-connectors/InfiniAnalytics/README.md new file mode 100644 index 0000000000..104a64ffbd --- /dev/null +++ b/certified-connectors/InfiniAnalytics/README.md @@ -0,0 +1,68 @@ +# Infini Analytics + +## Publisher: Infini Analytics + +## Overview + +Infini Analytics lets you track and monitor the complete lifecycle of your automated processes directly from Power Automate. For every execution of an automation in your organization, you can record its start, intermediate events, warnings, errors, and end — giving you full traceability and audit history in a single platform. + +## Prerequisites + +- A Microsoft Power Apps or Power Automate plan with the ability to use custom connectors. +- An active [Infini Analytics](https://analytics.infini.es/signup) account. +- An **organization token** from the Infini platform (Settings → Organization). +- The **automation ID** (`automation_id`) of each automation you want to monitor. + +## Authentication + +This connector uses **API Key** authentication via an HTTP header named `token`. + +1. Log in to the [Infini Analytics platform](https://analytics.infini.es/signup). +2. Navigate to **Settings → Organization**. +3. Copy your **Organization Token**. +4. When creating a new connection in Power Automate, paste this token in the **Organization Token** field. + +> A missing or invalid token returns **HTTP 401 Unauthorized**. + +## Supported Operations + +### Register Execution Event (`registerEvent`) + +Records an event in the lifecycle of an automation. Use this action at each key point of your flow. + +| Event Type | Description | +|---|---| +| `START` | Marks the beginning of an execution | +| `EVENT` | Records a relevant intermediate milestone | +| `WARNING` | Records a non-critical warning (execution continues) | +| `ERROR` | Records a failure or exception — marks the execution as **failed** | +| `END` | Marks the successful end of an execution | + +**Input fields:** + +| Field | Required | Description | +|---|---|---| +| `automation_id` | Yes | UUID of the automation in the Infini platform | +| `execution_id` | Yes | Unique identifier for this execution (internal ID or timestamp) | +| `event` | Yes | Event type: START, EVENT, WARNING, END or ERROR | +| `description` | No | Free text describing the event | +| `error_id` | No | Error code — only applicable when event is ERROR | +| `error_description` | No | Detailed error message — only applicable when event is ERROR | + +## Getting Started + +1. Add the **Infini Analytics** connector to your flow. +2. Create a new connection using your Organization Token. +3. At the **start** of your flow, add a *Register Execution Event* action with `event = START`. +4. Add more actions with `event = EVENT` or `event = WARNING` at key points. +5. If an error occurs, add an action with `event = ERROR` and fill in `error_id` and `error_description`. +6. At the **end** of your flow, add a final action with `event = END`. + +> **Important:** Use the same `execution_id` value for all events belonging to the same execution. + +## Known Issues and Limitations + +- `error_id` and `error_description` are optional but should only be used when `event = ERROR`. +- Each `execution_id` must be unique across simultaneous executions of the same automation. +- The API only accepts HTTPS connections (HTTP requests are redirected with HTTP 301). +- Persistent 5XX errors indicate a temporary server issue. Contact [analytics@infini.es](mailto:analytics@infini.es) if the problem persists. From 7814d842337184478cc37a335d3a62dbf2e47c35 Mon Sep 17 00:00:00 2001 From: JavierInfini Date: Fri, 22 May 2026 13:52:06 +0200 Subject: [PATCH 2/2] Add files via upload --- .../apiDefinition.swagger.json | 195 ++++++++++++++++++ .../InfiniAnalytics/apiProperties.json | 21 ++ certified-connectors/InfiniAnalytics/icon.png | Bin 0 -> 2473 bytes .../InfiniAnalytics/icon2x.png | Bin 0 -> 4897 bytes 4 files changed, 216 insertions(+) create mode 100644 certified-connectors/InfiniAnalytics/apiDefinition.swagger.json create mode 100644 certified-connectors/InfiniAnalytics/apiProperties.json create mode 100644 certified-connectors/InfiniAnalytics/icon.png create mode 100644 certified-connectors/InfiniAnalytics/icon2x.png diff --git a/certified-connectors/InfiniAnalytics/apiDefinition.swagger.json b/certified-connectors/InfiniAnalytics/apiDefinition.swagger.json new file mode 100644 index 0000000000..c43f03462e --- /dev/null +++ b/certified-connectors/InfiniAnalytics/apiDefinition.swagger.json @@ -0,0 +1,195 @@ +{ + "swagger": "2.0", + "info": { + "title": "Infini Analytics", + "description": "Track and monitor the complete lifecycle of your automations with Infini Analytics.\n\nSend start events (START), intermediate milestones (EVENT), non-critical warnings (WARNING), errors (ERROR) and completion events (END) to get full traceability and audit trails for every execution in your organization.\n\n**Getting started:**\n\n1. Get your **organization token** from the Infini platform (Settings → Organization).\n\n2. Find your **automation ID** (`automation_id`) in the automations list.\n\n3. Define a unique **execution ID** (`execution_id`) — it can be an internal system ID or a timestamp.\n\n4. Record events throughout the execution using the *Register event* action.\n\nAn execution is considered **successful** if it ends with END without any prior ERROR. As soon as an ERROR is recorded, the execution is marked as **failed**.", + "version": "1.0", + "contact": { + "name": "Infini Support", + "email": "analytics@infini.es", + "url": "https://analytics.infini.es/documentacion" + } + }, + "host": "api.analytics.infini.es", + "basePath": "/v1", + "schemes": ["https"], + "consumes": ["application/json"], + "produces": ["application/json"], + "x-ms-connector-metadata": [ + { + "property": "Website", + "value": "https://analytics.infini.es/signup" + }, + { + "property": "Privacy policy", + "value": "https://analytics.infini.es/tyc" + }, + { + "property": "Categories", + "value": "IT Operations;Productivity" + } + ], + "paths": { + "/register/": { + "post": { + "summary": "Register Execution Event", + "description": "Records an event in the lifecycle of an automation. Use this action at each key point of your flow to get complete traceability.\n\n**Recommended event flow:**\n\n- **START** → at the beginning of the flow, before any business logic.\n\n- **EVENT** → at important milestones (data reading, processing, sending...).\n\n- **WARNING** → if something is not ideal but the flow can continue.\n\n- **ERROR** → if an exception or failure occurs. Marks the execution as failed.\n\n- **END** → upon successful completion. Marks the execution as successful.\n\n**Note:** The `error_id` and `error_description` fields only apply when the event type is ERROR.", + "operationId": "registerEvent", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "required": ["automation_id", "execution_id", "event"], + "properties": { + "automation_id": { + "type": "string", + "x-ms-summary": "Automation ID", + "description": "Unique identifier (UUID) of the automation in the Infini platform. Find it in the automations list or ask your administrator. Format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.", + "example": "3571c1e0-88b9-4104-a0b0-f060b7fcc6eb", + "x-ms-visibility": "important" + }, + "execution_id": { + "type": "string", + "x-ms-summary": "Execution ID", + "description": "Unique identifier for this specific execution. Must be unique across simultaneous executions of the same automation. Use the same value for all events within the same execution. Can be an internal system ID or a timestamp (e.g. \"2025-03-03T15:32:17\").", + "example": "2025-03-03T15:32:17.571404", + "x-ms-visibility": "important" + }, + "event": { + "type": "string", + "x-ms-summary": "Event Type", + "description": "Event type to record in this call. START: start of execution. EVENT: relevant intermediate milestone. WARNING: non-critical warning (flow continues). ERROR: failure or exception (marks execution as failed). END: successful end of execution.", + "enum": ["START", "EVENT", "WARNING", "END", "ERROR"], + "x-ms-visibility": "important" + }, + "description": { + "type": "string", + "x-ms-summary": "Description", + "description": "Free text describing the event. It will appear in the execution history on the Infini platform. Being descriptive is recommended to facilitate subsequent auditing.", + "example": "Starting daily sales file processing", + "x-ms-visibility": "important" + }, + "error_id": { + "type": "string", + "x-ms-summary": "Error Code", + "description": "Only for ERROR event type. Error identifier code. Can be a code defined by your team (e.g. \"e0001\") or one automatically provided by the automation platform.", + "example": "e0001", + "x-ms-visibility": "advanced" + }, + "error_description": { + "type": "string", + "x-ms-summary": "Detailed Error Description", + "description": "Only for ERROR event type. Full error message, including the stacktrace or exception message provided by your automation platform (Power Automate, Python, etc.).", + "example": "NullReferenceException: Object reference not set to an instance of an object.", + "x-ms-visibility": "advanced" + } + } + } + } + ], + "responses": { + "201": { + "description": "Event registered successfully", + "schema": { + "type": "object", + "properties": { + "automation": { + "type": "string", + "x-ms-summary": "Automation ID", + "description": "UUID of the automation where the event was recorded" + }, + "execution_id": { + "type": "string", + "x-ms-summary": "Execution ID", + "description": "Execution identifier, as sent in the request" + }, + "type_of_event": { + "type": "string", + "x-ms-summary": "Recorded Event Type", + "description": "Type of event that was recorded (START, EVENT, WARNING, END or ERROR)" + }, + "description": { + "type": "string", + "x-ms-summary": "Description", + "description": "Event description as recorded" + }, + "error_id": { + "type": "string", + "x-ms-summary": "Error Code", + "description": "Recorded error code (only applies for ERROR events)" + }, + "error_description_detail": { + "type": "string", + "x-ms-summary": "Error Detail", + "description": "Detailed error description (only applies for ERROR events)" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-ms-summary": "Registration Date and Time", + "description": "UTC date and time when the event was recorded in the Infini system" + } + } + } + }, + "401": { + "description": "Invalid or missing authentication token. Verify that the \"token\" header contains the correct value obtained from the Infini platform.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "500": { + "description": "Internal server error. This may indicate an unusually high load or a temporary issue. If it persists, contact analytics@infini.es.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "default": { + "description": "Unexpected error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + }, + "security": [{"api_key": []}], + "tags": ["Event Logging"] + } + } + }, + "definitions": { + "ErrorResponse": { + "type": "object", + "properties": { + "error": { + "type": "string", + "x-ms-summary": "Error Message", + "description": "Description of the error that occurred" + } + } + } + }, + "parameters": {}, + "responses": {}, + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "in": "header", + "name": "token", + "description": "Organization token obtained from the Infini platform. Find it under Settings → Organization → Token. Without this token or with an invalid token you will receive an HTTP 401 error." + } + }, + "security": [{"api_key": []}], + "tags": [ + { + "name": "Event Logging", + "description": "Records the lifecycle of automation executions" + } + ], + "x-ms-openai-manifest": { + "humanName": "Infini Analytics", + "modelDescription": "Connector to record and monitor the complete lifecycle of automations using Infini Analytics. Allows sending START (execution start), EVENT (intermediate milestone), WARNING (non-critical notice), ERROR (failure, marks execution as failed) and END (successful completion) events, associated with a specific automation and execution. Requires an organization token from the Infini platform." + } +} diff --git a/certified-connectors/InfiniAnalytics/apiProperties.json b/certified-connectors/InfiniAnalytics/apiProperties.json new file mode 100644 index 0000000000..b52d8bc48c --- /dev/null +++ b/certified-connectors/InfiniAnalytics/apiProperties.json @@ -0,0 +1,21 @@ +{ + "properties": { + "connectionParameters": { + "api_key": { + "type": "securestring", + "uiDefinition": { + "displayName": "Organization Token", + "description": "Authentication token obtained from the Infini platform (Settings → Organization)", + "tooltip": "Your organization's secret token in Infini Analytics. Required for all API calls.", + "constraints": { + "required": "true" + } + } + } + }, + "iconBrandColor": "#000000", + "capabilities": ["actions"], + "publisher": "Infini Analytics", + "stackOwner": "Infini Analytics" + } +} diff --git a/certified-connectors/InfiniAnalytics/icon.png b/certified-connectors/InfiniAnalytics/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd7e78037fa56f1fef26932212d23e3ce9b6f22 GIT binary patch literal 2473 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 X(Vbj+uGnD9UIE-)yfBqc0m**@y_}m! literal 0 HcmV?d00001 diff --git a/certified-connectors/InfiniAnalytics/icon2x.png b/certified-connectors/InfiniAnalytics/icon2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9acd9d61d59de4a7dc252f2c64cbef4cd2c0ddde GIT binary patch literal 4897 zcmdT|`8yQe_eY{3qA4LHrWs4J?^{BdC|hDoW68cRgR#p}VPwsgWe^b=j8I~beMz<< z*<SveEv9W)+k(9l#RFdti=Ka&BTIxr*+4QuN^qV4o3v8AE8 zTnp9Gc;audF%^*g%p{d@%VH>JI@xE4GQCnH@<|$#X>D+kEfL{G%dRoPWnggSb+^R( zS(+pS+jjw42O7J(+Vr4L0M2ucTH*9pF0fx<>+ZOWLnUv59MqbOh258OHdjkmLrp3y zsHcBJ|9TGX)z6fnrh^Wqk)+6li1 zuDc3#g5nQR1-B)_r&>wZ`F&9-}I!<#}K>1{FY?Q@8h z>Y|rg)P=lBCwTb9x+e7O@3D^`ThzG*7wgJ3PKd$PmpR5cQggBdyn8>Oheuad-t^SgOyT^r)29^~aMr%*UGc)?wrmbA^?2w#E(bb1Wnqvg0Dq4=oN`ZL zJEuW+6S`U7*y4)rasbbk#gggVEO*_aK@CX%a!W!HD*GoN+`1OJAPC$dbYpH5L+a&e zldF(OtTz&Vf?l&JYSKs?cdLuxz?tN!=^;{l~7O~xHxt5ro>z3Zh=a>c?8|}`tEPI=D60Y%L<29V&P8GalLlHDl$P`y=G7mlQNAJ`9xfh9k>l&{! za}@0w&;$>)_-O{gjvrPpi*0-PA!52fsd?+t8SFD}bxZ{1U;E28y1qO<2eXL8VNGG)&}AZLo`_UB`Y* zMNO}c(87G2XKnZSCX!x#yNK7HOwFZ)WMzl0(hCDR-<}6{W&GrU-}Jx_) z(c_0CIML7~g^8G54RNm7#NFckty|;mR9tK9o(&VFoY=%1UfkI18y2-|U*mnp`K9@y z--CV`6<&VB#h*@txss%r96>#P7x1IoZ)-;dK2}^8eED*J#tAj3Q>C(RRSoVKm2H7u z6j$-fH(gI=F0<3yR0U+v5MLPMCDcX*Q|%FO@J%l-ht~JIq|jjjV}W-2FuFc^p;>JG z=lenNo+hlT2%EbZW5d9tgVRxA%#l{V9$bQ!sRTC^{B_CUjle|lGUrQ0S|rV7?rNRE zA7P_oqCeCa5&;G@`8*4C37?~P&r_3}g>)`&aBRNmdAVeg8N$K|%zM%D>=?3Cy9^*6 z2wts^q3oPebcQ6c_!7D4MhXu<_%5x{vutssgZx^IOmcU4%8mKQoMA&`_FpD}5t2f2 z>P}7o2C6~Y5O9z^AbVumjpcP3+nzR2c^Hxza_Ita3ju?LKMU5VVRc1>1UxdbM_59J zS$RV2HqEYIY*crg4b;c_EPFqMzYipf2Nh}ZH8#PpUkmPc8X4#WcD2|^?Y%Hk+_EY1 z-eo7&%M2gRlqV~DxFs%O+|h`=DxTqvuIQRbpDg%$GBM?xVu>RizIArC-ek)B9(j)7 zB7`eu6$-4oYQK~#4Nb8D@%jEiMVeAoVAw|7Q?%N)s(+Y+0B7s3po%K;hBRdLH;s^Y z8%lbzrMpJd230L~Rt2;a#!Z2LW?#%^p_O;@{4b4KZD|LK$_J|6Z<~9a=G4C98O!W7 zwCd=m|3oxE(oYKeeBt4UBx>Qq+UoAXEQPC|_x!|N$y*{(Wo1UX&oG%UNE!SwbMzW- z%snFR^=ql!Ca=HgvCMT!2dc~WAIB#}g{!MDZT@0&X)WB5@1(jP|Dc6a`{;u^>7nbz z>RA16olF>wbJx3l+qDT?2;5$YV2|B)!Tx7R8*MCa70Hp}Ux&E`o>c~S%??Q1hg)lM zZ?HDf9cbB(TPiO^Cpb6|(_>O!lB*}UcR~7foy@!dA$;2tOVWOI^FJqCob^72?b-bW z9NT`)m|Ryvgg&WOdLsf^CNntf)Vzk@)h2ehIREhbe|7U=F5xktvnlK_3XmC8$lW9V zvt*_}25D|p``qu;fB`V4tzw#}a=&u)vTSw0`_Q*v7mRL8h5k#~Glt#9we0UVdmCmYB5;kI(l&Xyt~KnoLMeZyf%Iy_gnU_PHAM&jmH&rP9KU z7yz0QHeMobx3@{L8enZH&4M|;&iDsyNu}@Wj}j3t10A#c!_@TpkM7$&On`0Iq3x`H z*Zf=8%R6X{oFlJE@Qr!FPEOyB<@$rAR(hAc=PHoYl{N*&tvi=VwZZoPCBx5dAQEw+ z>7Ca^CBEDc{(1GMHYb{Zpswe>HnHhcb^E*1)vM>pJq7y)jpEwH zi(ptGzzod{B~Hcv{D<^Jl|xEMr}IhbdWJyVl#EXTp-W{}%2*D9Ywf zu*ZYX!hd~#8D3GC%b)RmW$GzbX?;M7eOxm)V?w|N4LmS=q+F@z=N{wy)t{q-HaODs zAw;Bl`(A{K_l%GZ+ovb-D@FdN`+QL?v#W|mr#Omyu^ePo$<-8KE#uF?pGd@9v zCMp>0ixSwwwU;vZ&o!^|imMH$4IR5oYTTiQ`uE)FKQ=GYJ6Rrxv_MT>h6^$$*m&H@ z%|;^cUbc<^Ra#k;#m5C+`fj!LDe%EQWGjL58K^+lWM;&M9p_N zdHY)q#Mt-}Z_Sl%+C_l2ww>(iT_2UUJNu8LQE=;U3#AeJy(Z-D%)tx171&KLk$!cp zV_DExq}@3qpziP2{X*_9U+H)Hsv`Kg7tWR2p}UQj+kc}-pTt`g3o`gM{hvQZPir?Y zK9^8Razs8EOCr0An$9IL$-?}jxYyldnOk*lHb_Wlyz=ZmPY5LJ@gxDrzWf>Cs|I?ucbh+;kZx$|qFmOvhh?sb1Dt z)l1@W<#7$`2Fs4Sw4;cqP0D+tOjX7&Y*sQS1Cg!L&{B1G;l(gT{P_IfgtDuUc5`=CCI(-pgJFGkvm=`IN&ouS*7skiJ3h*T;JNUUjiLaR+I@qZ0G4f5L^yg|G6elKP ziby-@EZ4pBX;eHk50{j`d}Nj-NFK2f%XbTElhiO8nKHS(X4?61qLC58wS69Q1786( zua-bv7atl4xYPKti6G0GVB_ELy(e;d<24Hq#Nw#iwJ*FlTS&(ka(2}tix=B&vJ>Bm z$EDlpDjB_-|5K!joM<&2RpSKfa1U5v(DDTz4ol8&r!rN&>Ac}OIuuAEaS5AwEeuk! z_R#mWn>|nMRm{bn4Sel&deTG%I=eT|aF*z~$9IvPrD_^!}F`f}k zRKN7wN19pvd-%Ck^RKg$B8UCEP^NRiW0odmsxJQP0aTBicWeqt+kY3Q-0Nim>K@p2 z1aMi_sH|0Xm==CBt5=Fmj(D8?p(753&$yentm9*O)Oasuwsz`UEu|G`>9)p5ZBi6y zTzg*UPde*JX*|XY9ho)uO~Mj-{GNB3O3YJiK_t*PM-y_=52+yPtJy|R2S`x=Qu_Xp z)a0w6r{%v0i@*3%Zy;KgAFxV67<&rNZwjlPkSp zr$<{13pfo%TEn5HQqf)6r#Efr!pBC? z4w$vVm?)dlPw!+IiiMpTXYH1w zmjQ9k2A{l?v!hxZl7h{ou1>UtrK`-`kq$FRNkNYfChGA&iH#-inK)d_H7zP4nThBC z!4^+(iUp7W((mX|GwbYoA#9?WgIdw)1+M7Thk|9(%OeE#!L5#<-roDrfFmJ0y8Ksk zU(a0-qH;}Xw!zb+YW2-s=TeMl~9Xt