{"_id":"@apitube/news-api","_rev":"3-a1841536f638699ebaeada7f49b4669e","name":"@apitube/news-api","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.3":{"name":"@apitube/news-api","version":"1.0.3","keywords":["apitube","news","news-api","sentiment","nlp","sdk","typescript"],"author":{"name":"APITube"},"license":"MIT","_id":"@apitube/news-api@1.0.3","maintainers":[{"name":"liamka","email":"liamka@me.com"}],"homepage":"https://github.com/apitube/news-api-node#readme","bugs":{"url":"https://github.com/apitube/news-api-node/issues"},"dist":{"shasum":"1b43690dcc19c092f8f815d9806d95c695a904f5","tarball":"https://registry.npmjs.org/@apitube/news-api/-/news-api-1.0.3.tgz","fileCount":8,"integrity":"sha512-9NpVI0xOFr95jVJPIuX7sr30lpkHKiDAbfQ5yAXAfFb0CqexpNxj4Tg/DyyBZeplRtDBEdk0pTYgocMPfXRTBQ==","signatures":[{"sig":"MEUCIQCzpMpvVzfgmZQnRwmWIf79FyFfwUghw55a5eIat7XLzAIgZ2BqzJcWy1kqRFGfSBk0llyVUSLUoebEzJR5YL86lf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153452},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a217fcac097aa177ef1af7ccd7deab37bb1cf3e8","scripts":{"test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"liamka","email":"liamka@me.com"},"repository":{"url":"git+https://github.com/apitube/news-api-node.git","type":"git"},"_npmVersion":"10.9.2","description":"Node.js SDK for the APITube News API — access global news articles, headlines, stories, sentiment analysis, and more.","directories":{},"_nodeVersion":"23.6.1","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^20.12.0","axios-mock-adapter":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/news-api_1.0.3_1776192506846_0.2770842471044015","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@apitube/news-api","version":"1.1.4","keywords":["apitube","news","news-api","sentiment","nlp","sdk","typescript"],"author":{"name":"APITube"},"license":"MIT","_id":"@apitube/news-api@1.1.4","maintainers":[{"name":"liamka","email":"liamka@me.com"}],"homepage":"https://github.com/apitube/news-api-node#readme","bugs":{"url":"https://github.com/apitube/news-api-node/issues"},"dist":{"shasum":"8ce804a860fb2800dd44969c6ac9d3c30ee960cf","tarball":"https://registry.npmjs.org/@apitube/news-api/-/news-api-1.1.4.tgz","fileCount":8,"integrity":"sha512-NKG0QI8Y24o/kJjhO46a/KYVauI0g9r6VOdAQIESMB8gi4MJE2KDql8TEzq0L5Q78pF/iiv5i49+Vsl8h+Sk/g==","signatures":[{"sig":"MEUCIQC3O8svIDAV2r2lWAkaUwe3/kyR2vT7JGjGep5j4nha7AIgTFJk2LF8qnsWkr9uwREzXI9SRKBkcexVxM/W5FvCG9Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182543},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"92bff6fd08003606697d27a38c37d898588be3ee","scripts":{"test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"liamka","email":"liamka@me.com"},"repository":{"url":"git+https://github.com/apitube/news-api-node.git","type":"git"},"_npmVersion":"10.9.2","description":"Node.js SDK for the APITube News API — access global news articles, headlines, stories, sentiment analysis, and more.","directories":{},"_nodeVersion":"23.6.1","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^20.12.0","axios-mock-adapter":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/news-api_1.1.4_1780092238705_0.5418988984867985","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@apitube/news-api","version":"1.2.0","description":"Node.js SDK for the APITube News API — access global news articles, headlines, stories, sentiment analysis, and more.","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"keywords":["apitube","news","news-api","sentiment","nlp","sdk","typescript"],"author":{"name":"APITube"},"license":"MIT","homepage":"https://github.com/apitube/news-api-node#readme","repository":{"type":"git","url":"git+https://github.com/apitube/news-api-node.git"},"bugs":{"url":"https://github.com/apitube/news-api-node/issues"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"dependencies":{"axios":"^1.7.0"},"devDependencies":{"@types/node":"^20.12.0","axios-mock-adapter":"^2.1.0","tsup":"^8.3.0","tsx":"^4.19.0","typescript":"^5.6.0","vitest":"^2.1.0"},"_id":"@apitube/news-api@1.2.0","gitHead":"2180afb904565de1b02223b6dc599abe103354e8","_nodeVersion":"23.6.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-HGetk/J4J3A6wCPo/E768W03HnGoR+X59PB/CKqEqr8O6Y52VVvnDXY/4RCnqIxKhrpDD/sAmQep+8by6l9RZQ==","shasum":"1023394ca40a696356f9af1bf85f028bc4397777","tarball":"https://registry.npmjs.org/@apitube/news-api/-/news-api-1.2.0.tgz","fileCount":8,"unpackedSize":182543,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDKqrMD+TNuyEFszFrRm2xOHv0ZJZNaCS+3ORHU9YCf3AIgROfcE7Aq9LU8KYF3kjJHWk8SOgU1I2qJ57bd1WjwHuA="}]},"_npmUser":{"name":"liamka","email":"liamka@me.com"},"directories":{},"maintainers":[{"name":"liamka","email":"liamka@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/news-api_1.2.0_1780098207544_0.1884996534551937"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T18:48:26.755Z","modified":"2026-05-29T23:43:27.869Z","1.0.3":"2026-04-14T18:48:27.012Z","1.1.4":"2026-05-29T22:03:58.875Z","1.2.0":"2026-05-29T23:43:27.722Z"},"bugs":{"url":"https://github.com/apitube/news-api-node/issues"},"author":{"name":"APITube"},"license":"MIT","homepage":"https://github.com/apitube/news-api-node#readme","keywords":["apitube","news","news-api","sentiment","nlp","sdk","typescript"],"repository":{"type":"git","url":"git+https://github.com/apitube/news-api-node.git"},"description":"Node.js SDK for the APITube News API — access global news articles, headlines, stories, sentiment analysis, and more.","maintainers":[{"name":"liamka","email":"liamka@me.com"}],"readme":"# APITube News API Node.js SDK\n\n[![GitHub Release](https://img.shields.io/github/v/release/apitube/news-api-node)](https://github.com/apitube/news-api-node/releases)\n[![npm Version](https://img.shields.io/npm/v/@apitube/news-api)](https://www.npmjs.com/package/@apitube/news-api)\n[![Node.js Version](https://img.shields.io/node/v/@apitube/news-api)](https://www.npmjs.com/package/@apitube/news-api)\n[![License](https://img.shields.io/npm/l/@apitube/news-api)](https://www.npmjs.com/package/@apitube/news-api)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/apitube/news-api-node/pulls)\n[![TypeScript](https://img.shields.io/badge/TypeScript-ready-blue.svg)](https://www.typescriptlang.org/)\n[![Made with Love](https://img.shields.io/badge/Made%20with-%E2%9D%A4-red.svg)](https://apitube.io)\n\nNode.js/TypeScript SDK for the [APITube News API](https://apitube.io) — access global news articles, headlines, stories, sentiment analysis, and more.\n\n- [API Documentation](https://docs.apitube.io/)\n- [Website](https://apitube.io)\n- [More examples](https://github.com/apitube/news-api-workflows)\n- [Cookbook](https://apitube.io/cookbook)\n\n## Requirements\n\n- Node.js 18+\n- TypeScript 5+ (optional, fully typed)\n\n## Installation\n\n```bash\nnpm install @apitube/news-api\n```\n\n## Quick Start\n\n```ts\nimport { Client } from '@apitube/news-api';\n\nconst client = new Client({ apiKey: 'your-api-key' });\n\n// Search news articles\nconst response = await client.news('everything', {\n  title: 'artificial intelligence',\n  'language.code': 'en',\n  per_page: 5,\n});\n\nfor (const article of response.articles) {\n  console.log(article.title);\n  console.log(article.url);\n}\n```\n\n## Usage\n\n### Initialize the client\n\n```ts\nimport { Client } from '@apitube/news-api';\n\nconst client = new Client({\n  apiKey: 'your-api-key',\n  baseUrl: 'https://api.apitube.io', // optional, default value\n});\n```\n\nYou can pass a custom axios instance:\n\n```ts\nimport axios from 'axios';\nimport { Client } from '@apitube/news-api';\n\nconst httpClient = axios.create({ timeout: 30_000 });\nconst client = new Client({ apiKey: 'your-api-key', httpClient });\n```\n\n### Search articles\n\n```ts\nconst response = await client.news('everything', {\n  title: 'climate change',\n  'language.code': 'en',\n  per_page: 10,\n});\n\nconsole.log(`Page: ${response.page}`);\nconsole.log(`Has next page: ${response.hasNextPages ? 'yes' : 'no'}`);\n\nfor (const article of response.articles) {\n  console.log(article.title);\n  console.log(`Source: ${article.source?.domain}`);\n  console.log(`Sentiment: ${article.sentiment?.overall?.polarity}`);\n}\n```\n\n### Specify API version\n\n```ts\nconst response = await client.news('everything', {\n  title: 'artificial intelligence',\n  per_page: 5,\n}, 'v1');\n```\n\nBy default, the SDK uses `v1`.\n\n### Top headlines\n\n```ts\nconst response = await client.news('top-headlines', {\n  'language.code': 'en',\n  per_page: 10,\n});\n\nfor (const article of response.articles) {\n  console.log(`${article.title} — ${article.source?.domain}`);\n}\n```\n\n### Get a single article\n\n```ts\nconst response = await client.news('article', { id: 'article-id' });\nconst article = response.articles[0];\nconsole.log(article.title);\nconsole.log(article.body);\n```\n\n### Get articles by story\n\n```ts\nconst response = await client.news('story', { id: 'story-id' });\nfor (const article of response.articles) {\n  console.log(article.title);\n}\n```\n\n### Raw articles\n\nFetch recently discovered articles before parsing and enrichment:\n\n```ts\nconst response = await client.news('raw', {\n  per_page: 50,\n  'sort.by': 'published_at',\n  'sort.order': 'desc',\n});\nfor (const article of response.articles) {\n  console.log(article.title);\n}\n```\n\n### Count articles\n\nCount articles matching the same filters as `everything`:\n\n```ts\nconst count = await client.count({\n  title: 'artificial intelligence',\n  'language.code': 'en',\n});\nconsole.log(`Matching articles: ${count}`);\n```\n\n### Autocomplete suggestions\n\nSupported types: `categories`, `topics`, `industries`, `entities`.\n\n```ts\nconst items = await client.suggest('categories', 'spo');\nfor (const item of items) {\n  console.log(`${item.name} (id: ${item.id})`);\n}\n```\n\n### Reference data (people, companies, sources, journalists)\n\nEach entity exposes a paginated list method and a profile method by ID:\n\n```ts\n// List\nconst people = await client.people({ name: 'Elon', per_page: 5 });\nfor (const person of people.results) {\n  console.log(`${person.name} (id: ${person.id})`);\n}\n\n// Profile with coverage statistics\nconst profile = await client.person(people.results[0].id);\nconsole.log(`Articles: ${profile.coverage?.article_count}`);\n\n// Same shape for the other entities:\nawait client.companies({ name: 'Tesla' });\nawait client.company(id);\nawait client.sources({ country: 1 });\nawait client.source(id);\nawait client.journalists({ name: 'Smith' });\nawait client.journalist(id);\n```\n\n### Check balance\n\n```ts\nconst balance = await client.balance();\nconsole.log(`Plan: ${balance.plan}`);\nconsole.log(`Points: ${balance.points}`);\n```\n\n### Ping\n\n```ts\nconst isAvailable = await client.ping();\nconsole.log(isAvailable ? 'API is available' : 'API is unavailable');\n```\n\n## Error Handling\n\n```ts\nimport {\n  ApiException,\n  AuthenticationException,\n  RateLimitException,\n} from '@apitube/news-api';\n\ntry {\n  const response = await client.news('everything', { title: 'node' });\n} catch (e) {\n  if (e instanceof AuthenticationException) {\n    console.log(`Auth error: ${e.message}`);\n  } else if (e instanceof RateLimitException) {\n    console.log(`Rate limited. Retry after: ${e.retryAfter} seconds`);\n  } else if (e instanceof ApiException) {\n    console.log(`API error (${e.statusCode}): ${e.message}`);\n    console.log(`Request ID: ${e.requestId}`);\n  }\n}\n```\n\n## Testing\n\n```bash\nnpm install\nnpm test\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}