{"id":50349544,"url":"https://github.com/microlinkhq/microlink-zapier","last_synced_at":"2026-05-29T20:30:43.069Z","repository":{"id":354543223,"uuid":"1179224551","full_name":"microlinkhq/microlink-zapier","owner":"microlinkhq","description":"Zapier integration for the Microlink API. Turn any website into structured data, screenshots, PDFs, and more — no code required.","archived":false,"fork":false,"pushed_at":"2026-03-11T20:18:47.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T02:40:56.273Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microlinkhq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-11T20:18:18.000Z","updated_at":"2026-03-12T19:09:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/microlinkhq/microlink-zapier","commit_stats":null,"previous_names":["microlinkhq/microlink-zapier"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/microlinkhq/microlink-zapier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microlinkhq%2Fmicrolink-zapier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microlinkhq%2Fmicrolink-zapier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microlinkhq%2Fmicrolink-zapier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microlinkhq%2Fmicrolink-zapier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microlinkhq","download_url":"https://codeload.github.com/microlinkhq/microlink-zapier/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microlinkhq%2Fmicrolink-zapier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33670211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-29T20:30:40.733Z","updated_at":"2026-05-29T20:30:43.063Z","avatar_url":"https://github.com/microlinkhq.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# microlink-zapier-integration\n\n\u003e Microlink.io integration for Zapier CLI (`zapier-platform-core` v15): fetch metadata, screenshots, PDFs, Markdown, plain text, audio/video sources, performance insights, and logo palette data from any URL.\n\n\u003ca href=\"https://microlink.io\"\u003e\u003cimg src=\"https://img.shields.io/badge/powered_by-microlink.io-blue?style=flat-square\u0026color=%23EA407B\" alt=\"Powered by microlink.io\"\u003e\u003c/a\u003e\n\u003ca href=\"https://zapier.com/developer\"\u003e\u003cimg src=\"https://img.shields.io/badge/platform-Zapier%20CLI-FF4A00?style=flat-square\" alt=\"Zapier CLI\"\u003e\u003c/a\u003e\n\n---\n\n- [What This App Includes](#what-this-app-includes)\n- [Installation](#installation)\n  - [Prerequisites](#prerequisites)\n  - [Project Setup](#project-setup)\n- [Authentication](#authentication)\n- [Actions (Tools)](#actions-tools)\n  - [Extract](#extract)\n  - [Screenshot](#screenshot)\n  - [PDF](#pdf)\n  - [Markdown](#markdown)\n  - [Text](#text)\n  - [Audio](#audio)\n  - [Video](#video)\n  - [Insights](#insights)\n  - [Logo](#logo)\n- [Parameters Reference](#parameters-reference)\n  - [Top-level Inputs](#top-level-inputs)\n  - [Response Mode](#response-mode)\n  - [Browser and Rendering Options](#browser-and-rendering-options)\n  - [Data and Response Options](#data-and-response-options)\n  - [Caching and Network Options](#caching-and-network-options)\n  - [Viewport Options](#viewport-options)\n  - [PDF Options](#pdf-options)\n  - [Screenshot Options](#screenshot-options)\n  - [JSON Options](#json-options)\n  - [Additional Query Parameters](#additional-query-parameters)\n- [Query-Building Rules](#query-building-rules)\n- [Error Handling](#error-handling)\n- [How to Use in Zapier CLI](#how-to-use-in-zapier-cli)\n- [Testing](#testing)\n  - [Run All Tests](#run-all-tests)\n  - [Run Tests for One Action](#run-tests-for-one-action)\n  - [Test Structure](#test-structure)\n- [Project Structure](#project-structure)\n\n---\n\n## What This App Includes\n\n- Custom auth with optional API key (`x-api-key`) and optional base URL override.\n- 9 create actions (no triggers, no searches):\n  - `extract`, `screenshot`, `pdf`, `markdown`, `text`, `audio`, `video`, `insights`, `logo`.\n- Full Microlink query-param mapping, including nested dot-notation flattening.\n- Advanced options, JSON object inputs, and additional arbitrary query params.\n- Error normalization for HTTP failures and Microlink `{ status: \"error\" }` responses.\n- Action-level tests using `zapier-platform-core` test tools + `nock`.\n\n---\n\n## Installation\n\n### Prerequisites\n\n- Node.js `\u003e=18`\n- npm\n- Zapier CLI account access (for `zapier push`)\n\n### Project Setup\n\n```bash\nnpm install\n```\n\nRun tests:\n\n```bash\nnpm test\n```\n\n---\n\n## Authentication\n\nConfigured in `authentication.js` using Zapier `type: \"custom\"`.\n\n| Field | Type | Required | Description |\n|------|------|----------|-------------|\n| `apiKey` | password | No | Microlink Pro/Enterprise API key. If present, sent as `x-api-key` header. |\n| `apiEnvironment` | string | No | Endpoint selection: `auto` (default), `public`, or `pro`. |\n| `baseUrl` | string | No | Legacy field from older connections, still honored if set to a trusted endpoint. |\n\nBase URL resolution:\n\n- If legacy `baseUrl` is present and trusted -\u003e use it.\n- Else if `apiEnvironment` is `public` -\u003e `https://api.microlink.io`.\n- Else if `apiEnvironment` is `pro` -\u003e `https://pro.microlink.io`.\n- Else if `apiKey` exists -\u003e `https://pro.microlink.io`.\n- Else -\u003e `https://api.microlink.io`.\n\nAuth test behavior:\n\n- Calls `GET \u003cbaseUrl\u003e?url=https://example.com`.\n- Expects Microlink JSON with `status: \"success\"`.\n\n---\n\n## Actions (Tools)\n\nAll tools are Zapier `creates` actions and share the same input fields.  \nEach action applies its own default query flags (shown below), then merges optional parameters.\n\n| Action Key | Label | File | Auto Query Params |\n|-----------|-------|------|-------------------|\n| `extract` | Extract | `creates/extract.js` | none |\n| `screenshot` | Screenshot | `creates/screenshot.js` | `screenshot=true` |\n| `pdf` | PDF | `creates/pdf.js` | `pdf=true` |\n| `markdown` | Markdown | `creates/markdown.js` | `force=true`, `meta=false`, `embed=markdown`, `data.markdown.attr=markdown` |\n| `text` | Text | `creates/text.js` | `force=true`, `meta=false`, `embed=text`, `data.text.attr=text` |\n| `audio` | Audio | `creates/audio.js` | `audio=true` |\n| `video` | Video | `creates/video.js` | `video=true` |\n| `insights` | Insights | `creates/insights.js` | `insights=true` |\n| `logo` | Logo | `creates/logo.js` | `palette=true` |\n\n### Extract\n\nReturns metadata and extracted data from a URL.\n\n### Screenshot\n\nGenerates browser-rendered screenshots. Supports viewport and screenshot options.\n\n### PDF\n\nGenerates PDFs. Supports PDF and viewport options.\n\n### Markdown\n\nReturns page content in Markdown format (using Microlink embed extraction).\n\n### Text\n\nReturns page content as plain text (using Microlink embed extraction).\n\n### Audio\n\nDetects playable audio sources.\n\n### Video\n\nDetects playable video sources.\n\n### Insights\n\nReturns performance/technology insights.\n\n### Logo\n\nReturns logo metadata, including palette data via `palette=true`.\n\n---\n\n## Parameters Reference\n\n### Top-level Inputs\n\n| Input Field | Type | Required | Default | Description |\n|------------|------|----------|---------|-------------|\n| `url` | string | Yes | - | The URL to analyze. |\n| `responseMode` | string | No | `auto` | `auto`, `json`, `text`, or `binary`. |\n| `binaryProperty` | string | No | `data` | Output property name for binary mode payloads. |\n\n### Response Mode\n\n| Mode | Behavior |\n|------|----------|\n| `auto` | Returns JSON unless `embed` is present, then returns text payload. |\n| `json` | Expects/returns Microlink JSON envelope (`{ status, data, ... }`). |\n| `text` | Uses raw HTTP response and returns `{ status: \"success\", data: \"\u003ctext\u003e\" }` unless Microlink JSON envelope is returned. |\n| `binary` | Uses raw HTTP response and returns base64 payload in the configured `binaryProperty` (plus `encoding: \"base64\"`). If Microlink JSON is returned, it is validated and returned as JSON. |\n\n### Browser and Rendering Options\n\n| Field | Type | Default | Microlink Query Key | Description |\n|------|------|---------|---------------------|-------------|\n| `adblock` | boolean | `false` | `adblock` | Block ads during rendering. |\n| `animations` | boolean | `false` | `animations` | Enable/disable animations. |\n| `javascript` | boolean | `true` | `javascript` | Enable JavaScript execution. |\n| `prerender` | boolean | `false` | `prerender` | Render with browser prerendering. |\n| `click` | string | - | `click` | CSS selector to click before capture. |\n| `scroll` | string | - | `scroll` | Scroll instruction (`1000`, `#selector`, etc.). |\n| `waitForSelector` | string | - | `waitForSelector` | Wait for selector to appear. |\n| `waitForTimeout` | number | `0` | `waitForTimeout` | Wait fixed milliseconds before capture. |\n| `waitUntil` | string | - | `waitUntil` | Navigation event (`load`, `domcontentloaded`, `networkidle0`, `networkidle2`). |\n| `device` | string | - | `device` | Device emulation name. |\n| `colorScheme` | string | - | `colorScheme` | Force light/dark color scheme. |\n| `mediaType` | string | - | `mediaType` | CSS media type (`screen` / `print`). |\n| `scripts` | string | - | `scripts` | External scripts to inject. |\n| `styles` | string | - | `styles` | CSS to inject. |\n| `modules` | string | - | `modules` | ES modules to inject. |\n| `function` | string | - | `function` | Function to execute in page context. |\n\n### Data and Response Options\n\n| Field | Type | Default | Microlink Query Key | Description |\n|------|------|---------|---------------------|-------------|\n| `meta` | boolean | `true` | `meta` | Include metadata in response. |\n| `audio` | boolean | `false` | `audio` | Include audio extraction. |\n| `video` | boolean | `false` | `video` | Include video extraction. |\n| `insights` | boolean | `false` | `insights` | Include insights extraction. |\n| `logo` | boolean | `false` | `palette` | Include logo/palette data. |\n| `pdf` | boolean | `false` | `pdf` | Enable PDF output. |\n| `screenshot` | boolean | `false` | `screenshot` | Enable screenshot output. |\n| `filter` | string | - | `filter` | Filter response fields. |\n| `embed` | string | - | `embed` | Return one embedded field directly. |\n| `filename` | string | - | `filename` | Output filename hint. |\n| `force` | boolean | `false` | `force` | Bypass cache. |\n\n### Caching and Network Options\n\n| Field | Type | Default | Microlink Query Key | Description |\n|------|------|---------|---------------------|-------------|\n| `proxy` | string | - | `proxy` | Proxy mode or URL. |\n| `retry` | number | `0` | `retry` | Retry attempts. |\n| `timeout` | number | `0` | `timeout` | Max timeout in milliseconds. |\n| `ttl` | number | `0` | `ttl` | Cache TTL in seconds. |\n| `staleTtl` | number | `0` | `staleTtl` | Stale TTL in seconds. |\n| `ping` | boolean | `false` | `ping` | Warm cache / ping endpoint. |\n\n### Viewport Options\n\n| Field | Type | Default | Microlink Query Key |\n|------|------|---------|---------------------|\n| `viewportWidth` | number | `0` | `viewport.width` |\n| `viewportHeight` | number | `0` | `viewport.height` |\n| `viewportDeviceScaleFactor` | number | `0` | `viewport.deviceScaleFactor` |\n| `viewportIsMobile` | boolean | `false` | `viewport.isMobile` |\n| `viewportHasTouch` | boolean | `false` | `viewport.hasTouch` |\n| `viewportIsLandscape` | boolean | `false` | `viewport.isLandscape` |\n\n### PDF Options\n\n| Field | Type | Default | Microlink Query Key |\n|------|------|---------|---------------------|\n| `pdfFormat` | string | - | `pdf.format` |\n| `pdfWidth` | string | - | `pdf.width` |\n| `pdfHeight` | string | - | `pdf.height` |\n| `pdfLandscape` | boolean | `false` | `pdf.landscape` |\n| `pdfMargin` | string | - | `pdf.margin` |\n| `pdfPageRanges` | string | - | `pdf.pageRanges` |\n| `pdfScale` | number | `0` | `pdf.scale` |\n\n### Screenshot Options\n\n| Field | Type | Default | Microlink Query Key |\n|------|------|---------|---------------------|\n| `screenshotType` | string | - | `screenshot.type` |\n| `screenshotFullPage` | boolean | `false` | `screenshot.fullPage` |\n| `screenshotElement` | string | - | `screenshot.element` |\n| `screenshotOmitBackground` | boolean | `false` | `screenshot.omitBackground` |\n| `screenshotOverlayBackground` | string | `linear-gradient(225deg, #FF057C 0%, #8D0B93 50%, #321575 100%)` | `screenshot.overlay.background` |\n| `screenshotOverlayBrowser` | string | `dark` | `screenshot.overlay.browser` |\n| `screenshotCodeScheme` | string | - | `screenshot.codeScheme` |\n\n### JSON Options\n\nThese fields accept JSON objects (as text in Zapier UI). They are parsed and flattened into dot notation.\n\n| Field | Type | Default | Query Prefix | Description |\n|------|------|---------|--------------|-------------|\n| `headersJson` | text (JSON object) | `{}` | `headers.*` | Additional outbound HTTP headers. |\n| `dataJson` | text (JSON object) | `{}` | `data.*` | Custom extraction rules. |\n| `metaJson` | text (JSON object) | `{}` | `meta.*` | Custom metadata extraction config. |\n| `viewportJson` | text (JSON object) | `{}` | `viewport.*` | Nested viewport configuration. |\n| `insightsJson` | text (JSON object) | `{}` | `insights.*` | Nested insights configuration. |\n\nValidation:\n\n- If JSON is invalid or not an object, the app throws `InvalidInput` (`400`).\n\n### Additional Query Parameters\n\n`additionalParams` is a line-item input where each item has:\n\n- `key` (string)\n- `value` (string)\n\nBehavior:\n\n- Dot-notation keys are supported (for example, `data.author.selector`).\n- Values are loosely parsed:\n  - `\"true\"` / `\"false\"` -\u003e boolean\n  - numeric strings -\u003e number\n  - JSON strings -\u003e object/array\n- Objects are flattened recursively into dot-notation query params.\n- Additional params are applied last and can override built-in options.\n\n---\n\n## Query-Building Rules\n\nImplemented in `lib/microlink.js`.\n\n1. Start with action defaults (for example `pdf=true` for PDF action).\n2. Merge common input options.\n3. Merge JSON options (`dataJson`, `metaJson`, etc.) into existing objects.\n4. Flatten object-like params (`data`, `meta`, `headers`, `viewport`, `insights`).\n5. Apply `additionalParams` last.\n6. Nested keys win for boolean-or-object fields:\n   - if `screenshot.*` exists, remove top-level `screenshot`\n   - if `pdf.*` exists, remove top-level `pdf`\n   - if `insights.*` exists, remove top-level `insights`\n7. Empty values are skipped (`undefined`, `null`, empty string, numeric `0`).\n\n---\n\n## Error Handling\n\nAll request execution is centralized in `performMicrolinkRequest`.\n\n- HTTP failures (`\u003e=400`) -\u003e throws `z.errors.Error` with parsed Microlink message when available.\n- Microlink JSON payload with `status !== \"success\"` -\u003e throws `z.errors.Error`.\n- Invalid JSON object fields (for `*Json` inputs) -\u003e throws `InvalidInput` with status `400`.\n- Raw-text and binary modes still detect and validate Microlink JSON envelopes when returned.\n\n---\n\n## How to Use in Zapier CLI\n\n1. Install dependencies:\n\n```bash\nnpm install\n```\n\n2. Validate app:\n\n```bash\nnpx zapier validate\n```\n\n3. Run tests:\n\n```bash\nnpm test\n```\n\n4. Log in to Zapier CLI (if not already):\n\n```bash\nnpx zapier login\n```\n\n5. Push a new app version:\n\n```bash\nnpx zapier push\n```\n\n6. In Zapier editor:\n\n- Choose one of the 9 create actions.\n- Fill `url`.\n- Optionally set auth (`apiKey`) and advanced params.\n- Use `responseMode` according to output you need (`json`, `text`, or `binary`).\n\n---\n\n## Testing\n\nTests use:\n\n- `zapier-platform-core` `createAppTester`\n- `nock` for API mocking\n- `mocha` test runner\n\n### Run All Tests\n\n```bash\nnpm test\n```\n\n### Run Tests for One Action\n\n```bash\nnpx mocha test/creates/extract.test.js\nnpx mocha test/creates/screenshot.test.js\nnpx mocha test/creates/pdf.test.js\nnpx mocha test/creates/markdown.test.js\nnpx mocha test/creates/text.test.js\nnpx mocha test/creates/audio.test.js\nnpx mocha test/creates/video.test.js\nnpx mocha test/creates/insights.test.js\nnpx mocha test/creates/logo.test.js\n```\n\n### Test Structure\n\n```text\ntest/\n  helpers.js\n  creates/\n    extract.test.js\n    screenshot.test.js\n    pdf.test.js\n    markdown.test.js\n    text.test.js\n    audio.test.js\n    video.test.js\n    insights.test.js\n    logo.test.js\n```\n\n---\n\n## Project Structure\n\n```text\n.\n├── authentication.js\n├── index.js\n├── creates/\n│   ├── action-factory.js\n│   ├── extract.js\n│   ├── screenshot.js\n│   ├── pdf.js\n│   ├── markdown.js\n│   ├── text.js\n│   ├── audio.js\n│   ├── video.js\n│   ├── insights.js\n│   └── logo.js\n├── lib/\n│   ├── input-fields.js\n│   └── microlink.js\n└── test/\n    ├── helpers.js\n    └── creates/*.test.js\n```\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrolinkhq%2Fmicrolink-zapier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicrolinkhq%2Fmicrolink-zapier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrolinkhq%2Fmicrolink-zapier/lists"}