{"id":15798052,"url":"https://github.com/grokify/ringcentral-permahooks","last_synced_at":"2026-04-05T08:01:50.780Z","repository":{"id":28540989,"uuid":"116908998","full_name":"grokify/ringcentral-permahooks","owner":"grokify","description":"Webhook proxy to turn RingCentral webhooks into permanent webhooks for use with services like Zapier Instant Triggers.","archived":false,"fork":false,"pushed_at":"2025-11-16T06:40:30.000Z","size":1517,"stargazers_count":4,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-11-16T08:21:23.002Z","etag":null,"topics":["ringcentral","webhooks"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grokify.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-01-10T04:42:06.000Z","updated_at":"2025-11-16T06:39:10.000Z","dependencies_parsed_at":"2023-02-19T08:45:58.579Z","dependency_job_id":"be5f83f3-2a28-4ac2-ac82-5ad38f81e33f","html_url":"https://github.com/grokify/ringcentral-permahooks","commit_stats":{"total_commits":191,"total_committers":2,"mean_commits":95.5,"dds":0.4345549738219895,"last_synced_commit":"201b3d6367b578d2ff851562426693ce41d16414"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/grokify/ringcentral-permahooks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fringcentral-permahooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fringcentral-permahooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fringcentral-permahooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fringcentral-permahooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grokify","download_url":"https://codeload.github.com/grokify/ringcentral-permahooks/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fringcentral-permahooks/sbom","scorecard":{"id":446130,"data":{"date":"2025-08-11","repo":{"name":"github.com/grokify/ringcentral-permahooks","commit":"c2ebc7c987fe9e79c5182f859d12eb53815f66b0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/13 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yaml:1","Warn: no topLevel permission defined: .github/workflows/lint.yaml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/ci.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yaml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/ci.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yaml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/lint.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lint.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/lint.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/release.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/release.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/release.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/grokify/ringcentral-permahooks/release.yaml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:3: pin your Docker image by updating golang:1.23-alpine to golang:1.23-alpine@sha256:383395b794dffa5b53012a212365d40c8e37109a626ca30d6151c8348d380b5f","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yaml:19"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T06:46:13.508Z","repository_id":28540989,"created_at":"2025-08-19T06:46:13.508Z","updated_at":"2025-08-19T06:46:13.508Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31428645,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T02:22:46.605Z","status":"ssl_error","status_checked_at":"2026-04-05T02:22:33.263Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ringcentral","webhooks"],"created_at":"2024-10-05T00:23:13.459Z","updated_at":"2026-04-05T08:01:50.746Z","avatar_url":"https://github.com/grokify.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RingCentral Permahooks\n\n[![Build Status][build-status-svg]][build-status-url]\n[![Lint Status][lint-status-svg]][lint-status-url]\n[![Go Report Card][goreport-svg]][goreport-url]\n[![Docs][docs-godoc-svg]][docs-godoc-url]\n[![License][license-svg]][license-url]\n[![Docker Pulls][docker-hub-svg]][docker-hub-url]\n\nThis is a small app that turns RingCentral's expiring outbound webhooks into non-expiring webhooks. This is especially useful when connecting to a service with a simple inbound webhook implementation such as Zapier and chat solutions like [Glip](https://glip.com). Benefits include:\n\n* Seamlessly links RingCentral Outbound Webhooks with Inbound Webhooks offered by Zapier, Glip and others.\n\nThis is useful because RingCentral's webhook implementation has a couple of features that are not supported by all webhook consuming services. Both of the below are handled automatically by this service.\n\n* RingCentral requires the webhook endpoint return the request `Validation-Token` header in the response to indicate the receiving endpoint is the correct one.\n* RingCentral webhooks expire to ensure the correct site is receiving the information.\n\nDeployment options:\n\n* Run locally: only the `main.go` file is necessary as shown below.\n* Lambda: TBD, will use [aws/aws-lambda-go](https://github.com/aws/aws-lambda-go) like [Chathooks](https://github.com/grokify/chathooks)\n\nSee more information about creating RingCentral webhooks here:\n\n* API Reference: https://developer.ringcentral.com/api-docs/latest/index.html#!#RefCreateSubscription\n* Developer Guide: http://ringcentral-api-docs.readthedocs.io/en/latest/webhooks/\n\n## Pre-requisites\n\nYou must have created an app on the RingCentral Developer Platform by logging into the Developer Portal:\n\nhttps://developer.ringcentral.com\n\nThe app must have the following settings:\n\n* Application Type: `Private`\n* Platform Type: `Server-only (No UI)`\n* OAuth Grant Types: `Refresh Access Token`, `Password flow`\n* Permissions: `Read Messages`, `Webhook Subscriptions`\n\nIn the Developer Portal, your app will look like this.\n\n![](docs/images/ringcentral-permahooks_app_configuration.png \"\")\n\n## Installation and Configuration\n\nBefore you can complete the following installation procedure, you need to get a webhook URL from your downstream service. For example, a Zapier webhook URL.\n\n```bash\n$ go get github.com/grokify/ringcentral-permahooks\n$ cd $GOPATH/src/github.com/grokify/ringcentral-permahooks\n$ cp sample.env .env\n$ vi .env\n$ go run main.go\n```\n\nAfter you start the service, create a webhook by calling the `/createhook` endpoint. You can also call the `/renewhook` endpoint to manually renew the webhook. For example:\n\n```bash\n# Create Webhook\n$ curl -XGET 'https://12345678.ngrok.io/createhook'\n\n# Renew Webhook\n$ curl -XGET 'https://12345678.ngrok.io/renewhook'\n```\n\nSuccessfully calling `/createhook` will result in log entries like the following:\n\n```bash\n$ go run main.go \nINFO[0023] Creating Hook...                             \nINFO[0024] {\"eventFilters\":[\"/restapi/v1.0/account/~/extension/~/message-store/instant?type=SMS\",\"/restapi/v1.0/subscription/~?threshold=86400\\u0026interval=3600\"],\"deliveryMode\":{\"transportType\":\"WebHook\",\"address\":\"https://12345678.ngrok.io/webhook\"},\"expiresIn\":604800} \nINFO[0025] Handling webhook...                          \nINFO[0025] Validation-Token: 11112222-3333-4444-5555-666677778888 \nINFO[0025] Created/renewed Webhook with Id: 11112222-3333-4444-5555-666677778888\n```\n\n### Tunneling\n\nIf your server is behind a NAT or a firewall and not accessible via the Internet, you can use a tunneling service such as [ngrok](https://ngrok.com/). In the following example, you would create a RingCentral webhook to `https://12345678.ngrok.io/webhook` which you would set as `PERMAHOOKS_INBOUND_WEBHOOK_URL` in your environment.\n\n```bash\n$ ngrok http 8080\n\nngrok by @inconshreveable                                                                             (Ctrl+C to quit)\n                                                                                                                      \nTunnel Status                 online                                         \nUpdate                        update available (version 2.2.8, Ctrl-U to update)\nVersion                       2.0.25/prod                              \nRegion                        United States (us)                            \nWeb Interface                 http://127.0.0.1:4040                            \nForwarding                    http://12345678.ngrok.io -\u003e localhost:8080       \nForwarding                    https://12345678.ngrok.io -\u003e localhost:8080\n\nConnections                   ttl     opn     rt1     rt5     p50     p90\n                              83      0       0.00    0.00    18.68   301.08\n```\n\n## To Do\n\n### Docker Hub\n\nDocker repo: https://hub.docker.com/r/grokify/ringcentral-permahooks\n\n1. Build: `% docker build -t grokify/ringcentral-permahooks:v0.2.3 .`\n1. Login: `% docker login -u [username] -p [password]`\n1. Push: `% docker push grokify/ringcentral-permahooks:v0.2.3`\n\n### Heroku Support\n\nHeroku support is under investigation. For Heroku, dependences are managed with `godep`. The following is used:\n\n```bash\n$ go get -u github.com/tools/godep\n$ cd $GOPATH/src/github.com/grokify/ringcentral-permahooks\n$ godep save ./...\n```\n\nMore information is avialable here:\n\nhttps://devcenter.heroku.com/articles/go-dependencies-via-godep\n\n## Support\n\nIf you have questions or support, please use the following resources:\n\n* Stack Overflow: https://stackoverflow.com/questions/tagged/ringcentral\n* GitHub: https://github.com/grokify/ringcentral-permahooks/issues\n\n [build-status-svg]: https://github.com/grokify/ringcentral-permahooks/actions/workflows/ci.yaml/badge.svg?branch=master\n [build-status-url]: https://github.com/grokify/ringcentral-permahooks/actions/workflows/ci.yaml\n [lint-status-svg]: https://github.com/grokify/ringcentral-permahooks/actions/workflows/lint.yaml/badge.svg?branch=master\n [lint-status-url]: https://github.com/grokify/ringcentral-permahooks/actions/workflows/lint.yaml\n [goreport-svg]: https://goreportcard.com/badge/github.com/grokify/ringcentral-permahooks\n [goreport-url]: https://goreportcard.com/report/github.com/grokify/ringcentral-permahooks\n [docs-godoc-svg]: https://pkg.go.dev/badge/github.com/grokify/ringcentral-permahooks\n [docs-godoc-url]: https://pkg.go.dev/github.com/grokify/ringcentral-permahooks\n [license-svg]: https://img.shields.io/badge/license-MIT-blue.svg\n [license-url]: https://github.com/grokify/ringcentral-permahooks/blob/master/LICENSE.md\n [docker-hub-svg]: https://img.shields.io/docker/pulls/grokify/ringcentral-permahooks?logo=docker\u0026label=docker%20pulls%20%2F%20ringcentral-permahooks\n [docker-hub-url]: https://hub.docker.com/r/grokify/ringcentral-permahooks\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrokify%2Fringcentral-permahooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrokify%2Fringcentral-permahooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrokify%2Fringcentral-permahooks/lists"}