{"id":19251015,"url":"https://github.com/onesignal/onesignal-node-api","last_synced_at":"2025-04-21T12:33:37.183Z","repository":{"id":38332322,"uuid":"399937451","full_name":"OneSignal/onesignal-node-api","owner":"OneSignal","description":"OneSignal Node Client","archived":false,"fork":false,"pushed_at":"2024-07-31T07:41:22.000Z","size":407,"stargazers_count":32,"open_issues_count":10,"forks_count":17,"subscribers_count":36,"default_branch":"main","last_synced_at":"2024-11-06T13:00:30.696Z","etag":null,"topics":["api","email","in-app-messaging","node","nodejs","notifications","onesignal","push","push-notifications","rest","sms"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OneSignal.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-08-25T19:38:12.000Z","updated_at":"2024-10-13T06:42:16.000Z","dependencies_parsed_at":"2024-05-03T00:49:03.091Z","dependency_job_id":"4fbe7416-a153-4066-93c2-e8da8cfe7395","html_url":"https://github.com/OneSignal/onesignal-node-api","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneSignal%2Fonesignal-node-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneSignal%2Fonesignal-node-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneSignal%2Fonesignal-node-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OneSignal%2Fonesignal-node-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OneSignal","download_url":"https://codeload.github.com/OneSignal/onesignal-node-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223864862,"owners_count":17216422,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api","email","in-app-messaging","node","nodejs","notifications","onesignal","push","push-notifications","rest","sms"],"created_at":"2024-11-09T18:19:37.981Z","updated_at":"2025-04-21T12:33:37.161Z","avatar_url":"https://github.com/OneSignal.png","language":"TypeScript","readme":"\u003ch1 align=\"center\"\u003eWelcome to @onesignal/node-onesignal 👋\u003c/h1\u003e\n\u003cp\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@onesignal/node-onesignal\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Version\" src=\"https://img.shields.io/npm/v/@onesignal/node-onesignal.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/OneSignal/node-onesignal#readme\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Documentation\" src=\"https://img.shields.io/badge/documentation-yes-brightgreen.svg\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/OneSignal/node-onesignal/graphs/commit-activity\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Maintenance\" src=\"https://img.shields.io/badge/Maintained%3F-yes-green.svg\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://twitter.com/onesignal\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Twitter: onesignal\" src=\"https://img.shields.io/twitter/follow/onesignal.svg?style=social\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e OpenAPI client for node-onesignal\n\n### 🏠 [Homepage](https://github.com/OneSignal/node-onesignal#readme)\n### 🖤 [npm](https://www.npmjs.com/package/@onesignal/node-onesignal)\n\n# Node Client SDK\nThe OneSignal Node client is a server OneSignal SDK for NodeJS. Integrate OneSignal with your backend events, data, and \nmore.\n\n\n# Install\n\n```sh\n# yarn\nyarn add @onesignal/node-onesignal\n\n# npm\nnpm install @onesignal/node-onesignal --save\n```\n\n# Usage\n```js\nconst OneSignal = require('@onesignal/node-onesignal');\n```\n```js\nimport * as OneSignal from '@onesignal/node-onesignal';\n```\n\n## Creating a client\n### Configuration\nWe can configure the client using the `createConfiguration` function. You can find more info on each configuration \nparameter [here](https://github.com/OpenAPITools/openapi-generator/pull/10283/files).\n\n```js\nconst configuration = OneSignal.createConfiguration(configParams);\n```\n\n### Initializing the Client\n```js\nconst client = new OneSignal.DefaultApi(configuration);\n```\n\n### Authentication\nYou can configure auth parameters passing them like this:\n\n```js\nconst configuration = OneSignal.createConfiguration({\n    userAuthKey: '\u003cYOUR_ORGANIZATION_API_KEY\u003e', // Organization key is only required for creating new apps and other top-level endpoints\n    restApiKey: '\u003cYOUR_REST_API_KEY\u003e', // App rest api key required for most endpoints\n});\n\nconst client = new OneSignal.DefaultApi(configuration);\n```\n\n#### Advanced Usage: Creating a brand-new app\nIf creating a new app via the client, the response will return the app's API key via the `basic_auth_key` response \nparameter. You can then use this to modify your configuration object and create a new client that will have both user-level and app-level authentication set up.\n\n```js\nconst response = await client.createApp(newapp);\n\nconst configuration = OneSignal.createConfiguration({\n    userAuthKey: '\u003cYOUR_ORGANIZATION_API_KEY\u003e',\n    restApiKey: response.basic_auth_key,\n});\n\nconst client = new OneSignal.DefaultApi(configuration);\n```\n\n---\n## API Reference\n\n\u003e See the full list of [API Endpoints](DefaultApi.md).\n\nTo make stateful changes requests should take on the following pattern:\n1. create or get an object\n2. make changes to that object\n3. pass the object to the request function to make the changes\n\nExamples of important OneSignal objects include `App`, `Notification`, `User`, and `Segment`.\n\nFor example, see the section below on creating an app. First an app object is created via the instantiation of the `App`\nclass. Then, the app instance is modified directly. Finally, we use the `client` to create the app via a remote request.\n\n### Creating an app\nCreates a new OneSignal app.\n\n**Example**\n```js\nconst app = new OneSignal.App();\n\n// configure your application\napp.name = 'app_name';\napp.gcm_key = '\u003cyour key here\u003e';\napp.android_gcm_sender_id = '\u003cyour id here\u003e';\n\nconst response = await client.createApp(app);\n```\n\n### Getting an app\nView the details of a single OneSignal app.\n\n**Example**\n```js\nconst app = await client.getApp('\u003capp id\u003e');\n```\n\n### Getting multiple apps\nView apps.\n\n**Example**\n```js\nconst apps = await client.getApps();\n```\n\n### Updating an app\nUpdates the name or configuration settings of an existing OneSignal app.\n\n**Example**\n```js\nconst app = new OneSignal.App();\napp.name = 'modified_app_name';\n\nconst udpateAppResponse = await client.updateApp('\u003cexisting_app_id\u003e', app);\n```\n\n### Creating a notification\nSends a notification to your users.\n\n**Example**\n```js\nconst notification = new OneSignal.Notification();\nnotification.app_id = app.id;\n// Name property may be required in some case, for instance when sending an SMS.\nnotification.name = \"test_notification_name\";\nnotification.contents = {\n  en: \"Gig'em Ags\"\n}\n\n// required for Huawei\nnotification.headings = {\n  en: \"Gig'em Ags\"\n}\nconst notification = await client.createNotification(notification);\n```\n### Creating a notification using Filters\nSends a notification to your users filtered by specific criteria.\n\n**Example**\n```js\nconst notification = new OneSignal.Notification();\nnotification.app_id = app.id;\n\nnotification.contents = {\n  en: \"Gig'em Ags\"\n}\n\n// required for Huawei\nnotification.headings = {\n  en: \"Gig'em Ags\"\n}\n\n// Find all the users that have not spent any amount in USD on IAP.\n// https://documentation.onesignal.com/reference/create-notification#send-to-users-based-on-filters\nnotification.filters = [\n    {\n        field: 'amount_spent',\n        relation: '=',\n        value: \"0\"\n    },\n];\n\nconst notification = await client.createNotification(notification);\n```\n\n### Canceling a notification\nStop a scheduled or currently outgoing notification.\n\n**Example**\n\n```js\nconst cancelNotificationResponse = await client.cancelNotification('\u003capp id\u003e', '\u003cnotification id\u003e');\n```\n\n\n### Getting a notification\nView the details of a single notification and outcomes associated with it.\n\n**Example**\n```js\nawait client.getNotification('\u003capp id\u003e', '\u003cnotification id\u003e');\n```\n\n### Getting notifications\nView the details of multiple notifications.\n\n| Param  | Type   | Description                                                                                                                                                                      |\n|--------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| app_id | string | The OneSignal App ID for your app.  Available in Keys \u0026amp; IDs.                                                                                                                 |\n| limit  | string | How many notifications to return.  Max is 50.  Default is 50.                                                                                                                    |\n| offset | number | Page offset. Default is 0. Results are sorted by queued_at in descending order. `queued_at` is a representation of the time that the notification was queued at.                 |\n| kind   | number | Kind of notifications returned:   * unset - All notification types (default)   * `0` - Dashboard only   * `1` - API only    * `3` - Automated only |\n\n\n**Example**\n```js\nconst notifications = await client.getNotifications('\u003capp id\u003e', '50', 0, 1);\n```\n\n### Getting notification history\nView the devices sent a message - **OneSignal Paid Plan Required**\nThis method will return all devices that were sent the given `notification_id` of an Email or Push Notification if used \nwithin 7 days of the date sent.\n\n**Example**\n```js\nconst notificationHistory = await client.getNotificationHistory('\u003cnotification id\u003e');\n```\n\n### Creating a segment\nCreate segments visible and usable in the dashboard and API - **Required: OneSignal Paid Plan**\n\n**Example**\n```js\nconst segment = new OneSignal.Segment();\n\nsegment.filters = [\n  { field: 'session_count', relation: '\u0026gt;', value: '1' },\n  { field: 'tag', key: 'my_tag', relation: 'exists' }\n]\n\nconst segment = await client.createSegments(app.id, segment);\n```\n\n### Deleting a segment\nDelete segments (not user devices) - **Required: OneSignal Paid Plan**\nYou can delete a segment under your app by calling this API. You must provide an API key in the Authorization header \nthat has admin access on the app.\nThe `segment_id` can be found in the URL of the segment when viewing it in the dashboard.\n\n**Example**\n```js\nconst deleteSegmentsResponse = await client.deleteSegments('\u003capp id\u003e', '\u003csegment id\u003e');\n```\n\n### Creating a player\nAdd a device.\n\n**Example**\n```js\nconst player = new OneSignal.Player();\nplayer.device_type = 1;\nplayer.app_id = app_id;\nplayer.identifier = '\u003cidentifier\u003e';\nconst player = await client.createPlayer(player);\n```\n\n### Getting a player\nView the details of an existing device in one of your OneSignal apps.\nThe email and the hash is **only required if you have enabled Identity Verification and `device_type` is email**.\n\n**Example**\n```js\nconst player = await client.getPlayer('\u003capp id\u003e', '\u003cplayer id\u003e', '\u003cemail auth hash\u003e');\n```\n\n### Getting players\nView the details of multiple devices in one of your OneSignal apps. \n\n⚠️ Unavailable for Apps Over 80,000 Users.\n\n| Param  | Type   | Description                                                      |\n|--------|--------|------------------------------------------------------------------|\n| app_id | string | The OneSignal App ID for your app.  Available in Keys \u0026amp; IDs. |\n| limit  | string | How many devices to return. Max is 300. Default is 300           |\n| offset | number | Result offset. Default is 0. Results are sorted by id;           |\n\n\n**Example**\n```js\nconst players = await client.getPlayers('\u003capp id\u003e', '300', 0);\n```\n\n### Exporting a player\nGenerate a compressed CSV export of all of your current user data. This method can be used to generate a compressed CSV\nexport of all of your existing user data and is a better alternative to retrieving this data using the /players API endpoint.\n\nSee [full CSV Export Reference](https://documentation.onesignal.com/reference/csv-export)\n\n**Example**\n```js\nconst exportPlayerResponse = await client.exportPlayer('\u003capp id\u003e', {\n  extra_fields: ['location', 'external_user_id'],\n  last_active_since: 1469392779,\n  segment_name: \"Subscribed Users\"\n});\n```\n\n\n### Updating a player\nUpdate an existing device in one of your OneSignal apps.\n\n**Example**\n```js\nconst updatePlayerResponse = await client.updatePlayer('\u003cplayer id\u003e', player);\n```\n\n### Updating player tags\nUpdate an existing device's tags in one of your OneSignal apps using the External User ID.\n\n```js\nconst playerToUpdate = new OneSignal.Player();\n\nplayer.app_id = APP_ID;\nplayer.device_type = 1;\n\nplayerToUpdate.external_user_id = 'your_player_external_id'; // setting the same external_user_id as before\nconst updatePlayerTagsRequestBody = new OneSignal.UpdatePlayerTagsRequestBody();\nupdatePlayerTagsRequestBody.tags = {'typescript_test_tag': 1};\nconst updatePlayerResponse = await api.updatePlayerTags(APP_ID, PLAYER_EXTERNAL_USER_ID, updatePlayerTagsRequestBody);\n```\n#### Deleting Tags\nTo delete a tag, include its key and set its value to blank (\"\"). Omitting a key/value will not delete it.\n\nFor example, if you wanted to delete two existing tags rank and category while simultaneously adding a new tag class, the \ntags JSON would look like the following:\n\n**Example**\n```json\n\"tags\": {\n   \"rank\": \"\",\n   \"category\": \"\",\n   \"class\": \"my_new_value\"\n}\n```\n\n### Deleting a player\nDeletes a user record.\n\n**Example**\n```js\nconst deletePlayerResponse = await client.deletePlayer(app.id, '\u003cplayer id\u003e')\n```\n\n### Getting outcomes\nView the details of all the outcomes associated with your app.\n\n🚧  **Requires your OneSignal App's REST API Key, available in Keys \u0026 IDs** 🚧\n\nOutcome data are accessible for 30 days before being deleted from our servers. You can export this data monthly if you need it for a more extended period.\n\n| Param               | Type   | Description                                                                                                                                                                                                                                                                                                                                                                                                     |\n|---------------------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| app_id              | string | The OneSignal App ID for your app.  Available in Keys \u0026amp; IDs.                                                                                                                                                                                                                                                                                                                                                |\n| outcome_names       | string | Required Comma-separated list of names and the value (sum/count) for the returned outcome data. Note: Clicks only support count aggregation. For out-of-the-box OneSignal outcomes such as click and session duration, please use the “os” prefix with two underscores. For other outcomes, please use the name specified by the user. Example:os__session_duration.count,os__click.count,CustomOutcomeName.sum |\n| outcome_names2      | string | If outcome names contain any commas, then please specify only one value at a time. Example: `outcome_names[]=os__click.count\u0026outcome_names[]=Sales, Purchase.count` where “Sales, Purchase” is the custom outcomes with a comma in the name.                                                                                                                                                                                                        |\n| outcome_time_range  | string | Optional Time range for the returned data. The values can be `1h` (for the last 1 hour data), `1d` (for the last 1 day data), or `1mo` (for the last 1 month data). Default is 1h if the parameter is omitted.                                                                                                                                                                                                        |\n| outcome_platforms   | string | Optional Platform id. Refer device\u0026#39;s platform ids for values. **Example:** `outcome_platform=0` for iOS `outcome_platform=7`, `8` for Safari and Firefox Default is data from all platforms if the parameter is omitted.                                                                                                                                                                                     |\n| outcome_attribution | string | Optional Attribution type for the outcomes. The values can be direct or influenced or unattributed. Example: outcome_attribution=direct Default is total (returns direct+influenced+unattributed) if the parameter is omitted.                                                                                                                                                                             |\n\n**Example**\n```js\nconst outcomes = await client.getOutcomes(app.id, 'os__click.count,os_session_duration.count,my_outcome.sum');\n```\n\n### Begin Live Activity\nStarts a Live Activity event\n```js\n// Create a player first\nconst player = new OneSignal.Player();\nplayer.device_type = 0;\nplayer.app_id = '\u003capp id\u003e';\nconst playerResponse = await api.createPlayer(player);\n\n// Prepare a request\nconst beginLiveActivityRequest: BeginLiveActivityRequest = {\n    push_token: '\u003cpush_token\u003e',\n    subscription_id: playerResponse.id!,\n};\nconst activityId = '\u003cactivity_id\u003e'; // any string\n\n// Begin activity\nawait api.beginLiveActivity('\u003capp_id\u003e', activityId, beginLiveActivityRequest);\n```\n\n### Update Live Activity\nUpdates a Live Activity event\n```js\nconst updateLiveActivityRequest: UpdateLiveActivityRequest = {\n    event_updates: {\n        data: 'test'\n    },\n    event: \"update\",\n    name: \"contents\"\n};\n\nawait api.updateLiveActivity('\u003capp_id\u003e', '\u003cactivity_id\u003e', updateLiveActivityRequest);\n```\n\n### End Live Activity\nStops a Live Activity event\n```js\nconst subscriptionId = '\u003csubscription_id\u003e'; // player id\nawait api.endLiveActivity('\u003capp_id\u003e', '\u003cactivity_id\u003e', subscriptionId);\n```\n\n### Subscription types\n* iOSPush\n* AndroidPush\n* FireOSPush\n* ChromeExtensionPush\n* ChromePush\n* WindowsPush\n* SafariLegacyPush\n* FirefoxPush\n* macOSPush\n* HuaweiPush\n* SafariPush\n* Email\n* SMS\n\n## Users\n### Creating a OneSignal User\n```js\nconst user = new OneSignal.User();\n\nconst aliasLabel = '\u003calias_label\u003e';\nconst aliasId = '\u003calias_id\u003e';\nconst subscriptionToken = '\u003csubscription_token\u003e';\n\nuser.identity = {\n    [aliasLabel]: aliasId,\n};\n\nuser.subscriptions = [\n  {\n    type: \"iOSPush\",\n    token: subscriptionToken,\n  }\n];\n\nconst createdUser = await api.createUser('\u003capp_id\u003e', user);\nassert(createdUser.identity!['onesignal_id'] != null);\n```\n\n### Getting a user by `onesignal_id`\n```js\nconst oneisgnalAliasLabel = \"onesignal_id\";\nconst onesignalAliasId = createdUser.identity!['onesignal_id'];\n\nconst fetchedUser = await api.fetchUser('\u003capp_id\u003e', oneisgnalAliasLabel, onesignalAliasId);\n```\n\n### Getting a user by an alias\n```js\nconst fetchedUser = await api.fetchUser('\u003capp_id\u003e', alias_label, alias_id);\n```\n\n### Updating a user\n```js\nconst updateUserRequest: UpdateUserRequest = {\n    properties: {\n        language: 'fr'\n    }\n};\n\nconst updatedUser = await api.updateUser('\u003capp_id\u003e', aliasLabel, aliasId, updateUserRequest);\n```\n\n### Deleting a user\n```js\nawait api.deleteUser('\u003capp_id\u003e', aliasLabel, aliasId);\n```\n\n## Subscriptions\n### Creating a subscription for existing user\n```js\nconst createSubscriptionRequestBody: CreateSubscriptionRequestBody = {\n    subscription: {\n        type: \"AndroidPush\",\n        token: '\u003csubscription_token\u003e',\n    }\n};\n\nconst response = await api.createSubscription('\u003capp_id\u003e', '\u003calias_label\u003e', '\u003calias_id\u003e', createSubscriptionRequestBody);\n```\n\n### Updating a subscription\n```js\nconst updateSubscriptionRequestBody: UpdateSubscriptionRequestBody = {\n    subscription: {\n        type: \"iOSPush\",\n        token: '\u003cnew-subscription-token\u003e',\n    }\n};\n\nawait api.updateSubscription('\u003capp_id\u003e', '\u003cexisting_subscription_id\u003e', updateSubscriptionRequestBody);\n```\n\n### Deleting a subscription\n```js\nawait api.deleteSubscription('\u003capp_id\u003e', '\u003csubscription_id\u003e');\n```\n\n### Transfer subscription ownership\nTransfers the subscription from one user to another.\n```js\n// Setting the user for transfering the subscription to. User is identyfied by an IdentityObject.\nconst transferSubscriptionRequestBody: TransferSubscriptionRequestBody = {\n    identity: otherUserIdentityObject\n};\n\nconst transferResponse = await api.transferSubscription('\u003capp_id\u003e', '\u003csubscription_id\u003e', transferSubscriptionRequestBody);\n```\n\n## Aliases\n### Fetching aliases for a user\n```js\nconst fetchResponse = await api.fetchAliases('\u003capp_id\u003e', '\u003csubscription_id\u003e');\n```\n\n### Fetching user identity\n```js\nconst fetchResponse = await api.fetchUserIdentity('\u003capp_id\u003e', '\u003calias_label\u003e', '\u003calias_id\u003e');\n```\n### Identifying user by alias\n```js\nconst userIdentityRequestBody: UserIdentityRequestBody = {\n    identity: {\n        ['\u003cnew_alias_label\u003e']: '\u003cnew_alias_id\u003e'\n    }\n};\n\nconst identifyResponse = await api.identifyUserByAlias('\u003capp_id\u003e', \n                                                       '\u003cexisting_alias_label\u003e', \n                                                       '\u003cexisting_alias_id\u003e',\n                                                       userIdentityRequestBody);\n```\n\n### Identifying user by subscription id\n```js\nconst userIdentityRequestBody: UserIdentityRequestBody = {\n    identity: {\n        ['\u003cnew_alias_label\u003e']: '\u003cnew_alias_id\u003e'\n    }\n};\n\nconst identifyResponse = await api.identifyUserBySubscriptionId('\u003capp_id\u003e', '\u003cexisting_subscription_id\u003e', userIdentityRequestBody);\n```\n\n### Deleting an alias\n```js\nawait api.deleteAlias('\u003capp_id\u003e', '\u003calias_label\u003e', '\u003calias_id\u003e', '\u003calias_label_to_delete\u003e');\n```\n## Author\n\n* Website: https://onesignal.com\n* Twitter: [@onesignal](https://twitter.com/onesignal)\n* Github: [@OneSignal](https://github.com/OneSignal)\n\n## 🤝 Contributing\n\nContributions, issues and feature requests are welcome!\u003cbr /\u003eFeel free to check [issues page](https://github.com/OneSignal/node-onesignal/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n## 📝 License\n\nCopyright © 2023 [OneSignal](https://github.com/OneSignal).\n\nThis project is [MIT](https://github.com/OneSignal/node-onesignal/blob/main/LICENSE) licensed.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonesignal%2Fonesignal-node-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fonesignal%2Fonesignal-node-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonesignal%2Fonesignal-node-api/lists"}