{"_id":"@cabdi_waaxid/og-io","_rev":"4-32fe61ecc68c7c30468a7332d83313f3","name":"@cabdi_waaxid/og-io","dist-tags":{"latest":"2.0.2"},"versions":{"1.0.0":{"name":"@cabdi_waaxid/og-io","version":"1.0.0","keywords":["opengraph","twitter-cards","metadata","scraper","seo","og-io","link-preview"],"author":{"name":"Cabdi Waaxid Siciid"},"license":"MIT","_id":"@cabdi_waaxid/og-io@1.0.0","maintainers":[{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"}],"homepage":"https://github.com/cabdiwaaxid-so/og-io#readme","bugs":{"url":"https://github.com/cabdiwaaxid-so/og-io/issues"},"dist":{"shasum":"cc9c6885d6ed63cdde4cb26601562f804d2bfcb0","tarball":"https://registry.npmjs.org/@cabdi_waaxid/og-io/-/og-io-1.0.0.tgz","fileCount":3,"integrity":"sha512-q3+u1ztjRIkVBs2kzzpCYkfUu+S3jlITYoRqqJrb7NGu3I+2z+oiSWrATbtPYUY/lt02XhDc9Z9fN9itxTA5BA==","signatures":[{"sig":"MEQCIAiD06ZcnA91QI9u9iMx0P/4ct+hPid66oMqlCX4uqyYAiAPrwpMV353fGvXhMFE4sUKmpJRqZnTvxKhZYMICYbrMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13249},"main":"./index.js","gitHead":"4eb41a57c531a050622f04b34d693ff6ec12dd4b","_npmUser":{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"},"repository":{"url":"git+https://github.com/cabdiwaaxid-so/og-io.git","type":"git"},"_npmVersion":"11.4.1","description":"Lightweight Open Graph & Twitter Card metadata scraper for Node.js, browsers, and Deno.","directories":{},"_nodeVersion":"23.0.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/og-io_1.0.0_1754746207788_0.5796033434624517","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@cabdi_waaxid/og-io","version":"2.0.0","keywords":["opengraph","twitter-cards","metadata","scraper","seo","og-io","link-preview"],"author":{"name":"Cabdi Waaxid Siciid"},"license":"MIT","_id":"@cabdi_waaxid/og-io@2.0.0","maintainers":[{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"}],"homepage":"https://github.com/cabdiwaaxid-so/og-io#readme","bugs":{"url":"https://github.com/cabdiwaaxid-so/og-io/issues"},"dist":{"shasum":"0651635c66e8e3dcc41b6dca5a71174e4ee50dba","tarball":"https://registry.npmjs.org/@cabdi_waaxid/og-io/-/og-io-2.0.0.tgz","fileCount":5,"integrity":"sha512-BtdSzTAPAOSiMdta42UZKYKz/phOPMK+Y7zZw7VG5ajij5b8Mejs9cQdKASn1IhIUlNdgFeHfvfcRwJgQK/kWQ==","signatures":[{"sig":"MEUCIQC9A9SJYTCPeesKk9mqx7PK8Zq1vLdlLIb1XIELjiNY3QIgfPJMf9D6UW0IlEcH1NjkZmotCkAhas2K3SQDQq0UwqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15258},"main":"./index.js","type":"module","types":"./index.d.ts","scripts":{"start":"node server.js"},"_npmUser":{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"},"repository":{"url":"git+https://github.com/cabdiwaaxid-so/og-io.git","type":"git"},"_npmVersion":"11.10.1","description":"Lightweight Open Graph & Twitter Card metadata scraper for Node.js, browsers,.","directories":{},"_nodeVersion":"25.3.0","dependencies":{"axios":"^1.13.6","cheerio":"^1.2.0","novaxjs2":"^9.4.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/og-io_2.0.0_1773588335949_0.6632206485210792","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@cabdi_waaxid/og-io","version":"2.0.1","keywords":["opengraph","twitter-cards","metadata","scraper","seo","og-io","link-preview"],"author":{"name":"Cabdi Waaxid Siciid"},"license":"MIT","_id":"@cabdi_waaxid/og-io@2.0.1","maintainers":[{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"}],"homepage":"https://github.com/cabdiwaaxid-so/og-io#readme","bugs":{"url":"https://github.com/cabdiwaaxid-so/og-io/issues"},"dist":{"shasum":"631d6d66017d5a686c3ed00900a427bee1f57701","tarball":"https://registry.npmjs.org/@cabdi_waaxid/og-io/-/og-io-2.0.1.tgz","fileCount":5,"integrity":"sha512-r4EWhYCNhkBMsV8axNBtbJQZFZHHjtAK8oIeOYsaony6mA/IEpf0bgFAOHVb+Rp5s2MpuPqzmWXt6K2opJglWg==","signatures":[{"sig":"MEQCIAj7XxTBfAupdl5HPMTiUJEIaUG351pf5stHDaHOR8gNAiABAjlVLdIUJiZe3wf9+ErwGCJbrcg+4HqpZvv7OPvf7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17041},"main":"./index.js","type":"module","types":"./index.d.ts","_npmUser":{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"},"repository":{"url":"git+https://github.com/cabdiwaaxid-so/og-io.git","type":"git"},"_npmVersion":"11.10.1","description":"Lightweight Open Graph & Twitter Card metadata scraper for Node.js, browsers,.","directories":{},"_nodeVersion":"25.3.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/og-io_2.0.1_1773592139215_0.3056982523258487","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@cabdi_waaxid/og-io","version":"2.0.2","description":"Lightweight Open Graph & Twitter Card metadata scraper for Node.js, browsers,.","main":"./index.js","type":"module","keywords":["opengraph","twitter-cards","metadata","scraper","seo","og-io","link-preview"],"author":{"name":"Cabdi Waaxid Siciid"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/cabdiwaaxid-so/og-io.git"},"types":"./index.d.ts","_id":"@cabdi_waaxid/og-io@2.0.2","bugs":{"url":"https://github.com/cabdiwaaxid-so/og-io/issues"},"homepage":"https://github.com/cabdiwaaxid-so/og-io#readme","_nodeVersion":"25.3.0","_npmVersion":"11.10.1","dist":{"integrity":"sha512-3V+bZ9JJ02l09SuwtFLg6opfnACPuHpQbFW5D//XnKaSMk6Uzj7aDY/lHzRuWRt0//ciSaF8aKRH+kSH+jvPFw==","shasum":"7b28ea11ed233f443fc5b2dfec427510101270cf","tarball":"https://registry.npmjs.org/@cabdi_waaxid/og-io/-/og-io-2.0.2.tgz","fileCount":5,"unpackedSize":17061,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGcSjyOtWzBI8NNFwtLxbyFWlEU/CxtH0+UXrJypMcZmAiAIdXj0xrVkWgiZvVWT2WbLDE4xORjpZQDrsSCc9VOc4w=="}]},"_npmUser":{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"},"directories":{},"maintainers":[{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/og-io_2.0.2_1773594054311_0.3900444377147596"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-09T13:30:07.694Z","modified":"2026-03-15T17:00:54.563Z","1.0.0":"2025-08-09T13:30:07.974Z","2.0.0":"2026-03-15T15:25:36.106Z","2.0.1":"2026-03-15T16:28:59.373Z","2.0.2":"2026-03-15T17:00:54.454Z"},"bugs":{"url":"https://github.com/cabdiwaaxid-so/og-io/issues"},"author":{"name":"Cabdi Waaxid Siciid"},"license":"MIT","homepage":"https://github.com/cabdiwaaxid-so/og-io#readme","keywords":["opengraph","twitter-cards","metadata","scraper","seo","og-io","link-preview"],"repository":{"type":"git","url":"git+https://github.com/cabdiwaaxid-so/og-io.git"},"description":"Lightweight Open Graph & Twitter Card metadata scraper for Node.js, browsers,.","maintainers":[{"name":"cabdi_waaxid","email":"cabdiwaaxidsiciid100@gmail.com"}],"readme":"# OG-io\n\nA lightweight, universal SDK for fetching and parsing Open Graph, Twitter Card, and SEO metadata from any URL. Works seamlessly in browsers, Node.js, Deno, and Bun.\n\n## Features\n\n- 🚀 **Universal** - Works in browsers, Node.js, Deno, Bun, and edge environments\n- 🔧 **Flexible** - Use your own backend server or the default public API\n- 📦 **Lightweight** - Zero dependencies for the client SDK\n- 🎯 **Accurate** - Properly parses Open Graph, Twitter Cards, and standard meta tags\n- 🔄 **CORS-friendly** - Built for use with your own backend API or the hosted service\n- 📝 **TypeScript** - Full type definitions included\n\n## Installation\n\n```bash\nnpm install @cabdi_waaxid/og-io\n```\n\n## Quick Start\n\n### Using the Default Public API (No Backend Required)\n\nThe SDK comes pre-configured to use the public API at `https://og-io.vercel.app/` - no setup required!\n\n```javascript\n// Browser or Node.js with fetch polyfill\nimport { og } from '@cabdi_waaxid/og-io';\n\n// Just works out of the box!\nconst data = await og('https://github.com');\nconsole.log(data.standard.title); // GitHub: Let's build from here\nconsole.log(data.og.image); // https://github.githubassets.com/images/modules/open_graph/github-logo.png\n```\n\n### Using Your Own Backend Server\n\nYou can also use your own backend server for complete control:\n\n```javascript\nimport { og, setBaseUrl } from '@cabdi_waaxid/og-io';\n\n// Point to your own backend server\nsetBaseUrl('https://your-og-server.com');\n\nconst data = await og('https://example.com');\n```\n\n## Architecture\n\nOG-io consists of two parts:\n\n1. **Client SDK** (this package) - Universal JavaScript library for making requests\n2. **Server API** - Backend service that fetches and parses metadata\n   - **Default Public API**: `https://og-io.vercel.app/` (free to use)\n   - **Custom Server**: You can host your own backend\n\n## API Reference\n\n### Core Functions\n\n#### `og(url, options)`\n\nFetches Open Graph and SEO metadata from a URL.\n\n**Parameters:**\n- `url` (string) - The URL to fetch metadata from\n- `options` (object) - Optional configuration\n  - `baseUrl` (string) - Override the base URL for this request\n  - `includeAllMeta` (boolean) - Include all meta tags in response\n  - `includeHtml` (boolean) - Include raw HTML in response\n\n**Returns:** `Promise<SEOData>`\n\n#### `setBaseUrl(url)`\n\nSets a custom base URL for the OG fetcher API.\n\n```javascript\nsetBaseUrl('https://your-og-server.com');\n```\n\n#### `resetBaseUrl()`\n\nResets the base URL to the default public API (`https://og-io.vercel.app/`).\n\n```javascript\nresetBaseUrl();\n```\n\n#### `getBaseUrl()`\n\nReturns the current base URL being used.\n\n```javascript\nconsole.log(getBaseUrl()); // 'https://og-io.vercel.app/' or your custom URL\n```\n\n#### `setFetch(fetchFn)`\n\nSets a custom fetch implementation (required for Node.js).\n\n```javascript\n// Node.js\nimport fetch from 'node-fetch';\nsetFetch(fetch);\n```\n\n### Constants\n\n#### `DEFAULT_BASE_URL`\n\nThe default public API endpoint.\n\n```javascript\nimport { DEFAULT_BASE_URL } from '@cabdi_waaxid/og-io';\nconsole.log(DEFAULT_BASE_URL); // 'https://og-io.vercel.app'\n```\n\n### Response Types\n\n#### `SEOData`\n\n```typescript\ninterface SEOData {\n  standard: StandardTags;     // Standard HTML meta tags\n  og: OGTags;                  // Open Graph protocol tags\n  twitter: TwitterTags;        // Twitter Card tags\n  other?: Record<string, string>; // All other meta tags (when includeAllMeta is true)\n  html?: string;               // Raw HTML content (when includeHtml is true)\n}\n```\n\n#### `StandardTags`\n\n```typescript\ninterface StandardTags {\n  title: string | null;        // Page title\n  description: string | null;  // Meta description\n  canonicalUrl: string | null; // Canonical URL\n  favicon: string | null;      // Favicon URL\n}\n```\n\n#### `OGTags`\n\n```typescript\ninterface OGTags {\n  title?: string;              // Open Graph title\n  description?: string;        // Open Graph description\n  image?: string;              // Open Graph image URL\n  url?: string;                // Open Graph URL\n  type?: string;               // Open Graph type\n  site_name?: string;          // Site name\n  [key: string]: string | undefined; // Other Open Graph tags\n}\n```\n\n#### `TwitterTags`\n\n```typescript\ninterface TwitterTags {\n  card?: string;               // Twitter card type\n  site?: string;               // Twitter site\n  title?: string;              // Twitter title\n  description?: string;        // Twitter description\n  image?: string;              // Twitter image URL\n  [key: string]: string | undefined; // Other Twitter tags\n}\n```\n\n## Usage Examples\n\n### Basic Usage with Default API\n\n```javascript\nimport { og } from '@cabdi_waaxid/og-io';\n\ntry {\n  const data = await og('https://github.com');\n  console.log('Title:', data.standard.title);\n  console.log('Description:', data.standard.description);\n  console.log('OG Image:', data.og.image);\n  console.log('Twitter Card:', data.twitter.card);\n} catch (error) {\n  console.error('Failed:', error.message);\n}\n```\n\n### Using Custom Backend Server\n\n```javascript\nimport { og, setBaseUrl } from '@cabdi_waaxid/og-io';\n\n// Switch to your own backend\nsetBaseUrl('https://my-og-server.com');\n\n// All subsequent calls will use your server\nconst data = await og('https://example.com');\n\n// Switch back to default public API if needed\nresetBaseUrl();\n```\n\n### Include All Meta Tags\n\n```javascript\nconst data = await og('https://example.com', {\n  includeAllMeta: true\n});\n\n// Access any meta tag\nconsole.log(data.other['viewport']);\nconsole.log(data.other['theme-color']);\n```\n\n### Include Raw HTML\n\n```javascript\nconst data = await og('https://example.com', {\n  includeHtml: true\n});\n\n// Raw HTML for custom parsing\nconsole.log(data.html.substring(0, 200) + '...');\n```\n\n### Node.js with node-fetch\n\n```javascript\nimport { og, setFetch } from '@cabdi_waaxid/og-io';\nimport fetch from 'node-fetch';\n\n// Required for Node.js environments\nsetFetch(fetch);\n\n// Uses default public API at https://og-io.vercel.app\nconst data = await og('https://example.com');\n```\n\n### Browser with Global Object\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@cabdi_waaxid/og-io@latest/index.js\"></script>\n<script>\n  // Available as window.ogFetcher\n  // Uses default public API automatically\n  ogFetcher.og('https://example.com').then(data => {\n    console.log(data.og.title);\n  });\n  \n  // Or use your own server\n  ogFetcher.setBaseUrl('https://your-server.com');\n</script>\n```\n\n### ES Modules Import\n\n```javascript\n// Named imports\nimport { og, setBaseUrl, resetBaseUrl, DEFAULT_BASE_URL } from '@cabdi_waaxid/og-io';\n\n// Default import\nimport ogFetcher from '@cabdi_waaxid/og-io';\nogFetcher.og('https://example.com');\n```\n\n## Error Handling\n\n```javascript\ntry {\n  const data = await og('https://example.com');\n} catch (error) {\n  console.error(error.message);\n}\n```\n\n## Environment Support\n\n| Environment | Support | Notes |\n|------------|---------|-------|\n| Browsers | ✅ Full | Uses native fetch, default API works out of the box |\n| Node.js | ✅ Full | Requires setFetch(), default API works with polyfill |\n| Deno | ✅ Full | Uses native fetch, default API works out of the box |\n| Bun | ✅ Full | Uses native fetch, default API works out of the box |\n| Cloudflare Workers | ✅ Full | Uses native fetch, default API works out of the box |\n| React Native | ✅ Full | May need polyfill, default API works with fetch support |\n\nThe default public API at `https://og-io.vercel.app/` is free to use. For production applications with high volume, consider [hosting your own backend server](#hosting-your-own-backend-server).\n\n## Hosting Your Own Backend Server\n\nThe package includes a sample server using `novaxjs2`:\n\n[Server file code](https://github.com/cabdiwaaxid-so/og-io/tree/main/api/index.js)\n\n```bash\n# Install server dependencies\nnpm install axios cheerio novaxjs2\n\n# Run the server\nnode index.js\n# Server running on port 3000\n```\n\nThen configure your client:\n\n```javascript\nsetBaseUrl('http://localhost:3000');\n```\n\n## TypeScript Support\n\nFull type definitions are included:\n\n```typescript\nimport { og, type SEOData, type FetchOptions } from '@cabdi_waaxid/og-io';\n\nconst options: FetchOptions = {\n  includeAllMeta: true\n};\n\nconst data: SEOData = await og('https://example.com', options);\n\nif (data.og.image) {\n  console.log(data.og.image);\n}\n```\n\n## License\n\n[MIT © Cabdi Waaxid Siciid](https://github.com/cabdiwaaxid-so/og-io/tree/main/src/LICENSE)\n\n## Contributing\n\nContributions are welcome! Please open an issue or submit a pull request on [GitHub](https://github.com/cabdiwaaxid-so/og-io).","readmeFilename":"README.md"}