{"id":20020985,"url":"https://github.com/sergeypedan/sms-pilot-api-v1","last_synced_at":"2026-06-09T19:31:36.593Z","repository":{"id":46226255,"uuid":"364798646","full_name":"sergeypedan/sms-pilot-api-v1","owner":"sergeypedan","description":"Simple wrapper around SMS pilot API v1","archived":false,"fork":false,"pushed_at":"2024-05-16T19:00:54.000Z","size":125,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-13T15:17:04.122Z","etag":null,"topics":["api","api-client","ruby","sms","sms-api"],"latest_commit_sha":null,"homepage":"https://sergeypedan.ru/open_source_projects/sms-pilot","language":"Ruby","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/sergeypedan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2021-05-06T05:47:55.000Z","updated_at":"2024-11-26T09:33:31.000Z","dependencies_parsed_at":"2024-11-13T08:45:21.131Z","dependency_job_id":null,"html_url":"https://github.com/sergeypedan/sms-pilot-api-v1","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sergeypedan/sms-pilot-api-v1","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergeypedan%2Fsms-pilot-api-v1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergeypedan%2Fsms-pilot-api-v1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergeypedan%2Fsms-pilot-api-v1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergeypedan%2Fsms-pilot-api-v1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sergeypedan","download_url":"https://codeload.github.com/sergeypedan/sms-pilot-api-v1/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergeypedan%2Fsms-pilot-api-v1/sbom","scorecard":{"id":812273,"data":{"date":"2025-08-11","repo":{"name":"github.com/sergeypedan/sms-pilot-api-v1","commit":"2b3084f90b10704c5a3094d81ef0eae6fced11f3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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":"Code-Review","score":0,"reason":"Found 0/21 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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":"Vulnerabilities","score":4,"reason":"6 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-2rxp-v6pw-ch6m","Warn: Project is vulnerable to: GHSA-4xqq-m2hx-25v8","Warn: Project is vulnerable to: GHSA-5866-49gr-22v4","Warn: Project is vulnerable to: GHSA-r55c-59qm-vjw6","Warn: Project is vulnerable to: GHSA-vg3r-rm7w-2xgh","Warn: Project is vulnerable to: GHSA-vmwr-mc7x-5vc3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 10 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"}}]},"last_synced_at":"2025-08-23T13:27:48.668Z","repository_id":46226255,"created_at":"2025-08-23T13:27:48.668Z","updated_at":"2025-08-23T13:27:48.668Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34123171,"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-06-09T02:00:06.510Z","response_time":63,"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":["api","api-client","ruby","sms","sms-api"],"created_at":"2024-11-13T08:35:09.476Z","updated_at":"2026-06-09T19:31:36.567Z","avatar_url":"https://github.com/sergeypedan.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SmsPilot API v1 client\n\n[![Gem Version](https://badge.fury.io/rb/sms-pilot-api-v1.svg)](https://badge.fury.io/rb/sms-pilot-api-v1)\n[![Maintainability](https://api.codeclimate.com/v1/badges/42765c3098d5f531a3f7/maintainability)](https://codeclimate.com/github/sergeypedan/sms-pilot-api-v1/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/42765c3098d5f531a3f7/test_coverage)](https://codeclimate.com/github/sergeypedan/sms-pilot-api-v1/test_coverage)\n[![Inch CI documentation](https://inch-ci.org/github/sergeypedan/sms-pilot-api-v1.svg?branch=master\u0026amp;style=flat)](https://inch-ci.org/github/sergeypedan/sms-pilot-api-v1)\n\nSimple wrapper around SMS pilot API v1. Version 1 because it returns more data within its standard response.\n\n## Installation\n\nfrom RubyGems:\n\n```ruby\ngem \"sms-pilot-api-v1\"\n```\n\nfrom GitHub:\n\n```ruby\ngem \"sms-pilot-api-v1\", git: \"https://github.com/sergeypedan/sms-pilot-api-v1.git\"\n```\n\n## Playground\n\nTest sending SMS from console with a test API key (find it at the end of this page):\n\n```sh\ncd $(bundle info sms-pilot-api-v1 --path)\nbin/console\n```\n\n\n## Usage\n\n### Initialize\n\n```ruby\nrequire \"sms_pilot\"\n\nkey = \"XXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZXXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZ\"\n\nclient = SmsPilot::Client.new(api_key: key)\nclient = SmsPilot::Client.new(api_key: key, locale: :en) # Available locales are [:en, :ru]\n```\n\nMethod [documentation](https://rubydoc.info/github/sergeypedan/sms-pilot-api-v1/master/SmsPilot/Client#initialize-instance_method) at RubyDoc.\n\n### Before sending\n\nThere are a bunch of methods describing the state of affairs:\n\n```ruby\nclient.api_key          # =\u003e \"YOUR API KEY\"\nclient.balance          # =\u003e nil\nclient.broadcast_id     # =\u003e nil\nclient.error            # =\u003e nil\nclient.phone            # =\u003e nil\nclient.rejected?        # =\u003e false\nclient.response_body    # =\u003e nil\nclient.response_data    # =\u003e {}\nclient.response_headers # =\u003e {}\nclient.response_status  # =\u003e nil\nclient.sender_blocked?  # =\u003e false\nclient.sms_cost         # =\u003e nil\nclient.sms_sent?        # =\u003e false\nclient.sms_status       # =\u003e nil\nclient.url              # =\u003e nil\n```\n\nbefore the request is sent they return obvious nils or empty structures; after the request they are populated with data.\n\nSee [structured documentation](https://rubydoc.info/github/sergeypedan/sms-pilot-api-v1/master/SmsPilot/Client) for those methods at RubyDoc.\n\n### Sending SMS\n\n```ruby\nclient.send_sms(\"+7 (902) 123-45-67\", \"Привет, мир!\")\nclient.send_sms(\"+7 (902) 123-45-67\", \"Привет, мир!\", \"ФССПРФ\")\n# =\u003e true\n```\n\nReturns result of `sms_sent?`, so it’s either `true` or `false`.\n\nMethod [documentation](https://rubydoc.info/github/sergeypedan/sms-pilot-api-v1/master/SmsPilot/Client#send_sms-instance_method) at RubyDoc.\n\n### Sending SMS succeeded\n\n```ruby\nclient.api_key          # =\u003e \"YOUR API KEY\"\nclient.balance          # =\u003e 20006.97\nclient.broadcast_id     # =\u003e 10000\nclient.error            # =\u003e nil\nclient.phone            # =\u003e \"79021234567\"\nclient.rejected?        # =\u003e false\nclient.response_body    # =\u003e \"{\\\"send\\\":[{\\\"server_id\\\":\\\"10000\\\",\\\"phone\\\":\\\"79021234567\\\",\\\"price\\\":\\\"1.68\\\",\\\"status\\\":\\\"0\\\"}],\\\"balance\\\":\\\"20006.97\\\",\\\"cost\\\":\\\"1.68\\\"}\"\nclient.response_data    # =\u003e {\"send\"=\u003e[{\"server_id\"=\u003e\"10000\", \"phone\"=\u003e\"79021234567\", \"price\"=\u003e\"1.68\", \"status\"=\u003e\"0\"}], \"balance\"=\u003e\"20006.97\", \"cost\"=\u003e\"1.68\"}\nclient.response_headers # =\u003e {\"Server\"=\u003e\"nginx\", \"Date\"=\u003e\"Thu, 06 May 2021 04:52:58 GMT\", \"Content-Type\"=\u003e\"application/json; charset=utf-8\", \"Content-Length\"=\u003e\"179\", \"Connection\"=\u003e\"close\", \"Access-Control-Allow-Origin\"=\u003e\"*\"}\nclient.response_status  # =\u003e 200\nclient.sender_blocked?  # =\u003e false\nclient.sms_cost         # =\u003e 1.68\nclient.sms_sent?        # =\u003e true\nclient.sms_status       # =\u003e 1\nclient.url              # =\u003e \"https://smspilot.ru/api.php?apikey=1234567890\u0026format=json\u0026send=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%2C+%D0%BC%D0%B8%D1%80%21\u0026to=79021234567\"\n```\n\n### Sending SMS failed (but HTTP request succeeded)\n\n```ruby\nclient.api_key          # =\u003e \"YOUR API KEY\"\nclient.balance          # =\u003e nil\nclient.broadcast_id     # =\u003e nil\nclient.error            # =\u003e \"Неправильный API-ключ (см. настройки API в личном кабинете) (код ошибки: 101)\"\nclient.phone            # =\u003e \"79021234567\"\nclient.rejected?        # =\u003e true\nclient.response_body    # =\u003e \"{\\\"error\\\":{\\\"code\\\":\\\"101\\\",\\\"description\\\":\\\"APIKEY is invalid\\\",\\\"description_ru\\\":\\\"Неправильный API-ключ (см. настройки API в личном кабинете)\\\"}}\"\nclient.response_data    # =\u003e {\"error\"=\u003e{\"code\"=\u003e\"101\", \"description\"=\u003e\"APIKEY is invalid\", \"description_ru\"=\u003e\"Неправильный API-ключ (см. настройки API в личном кабинете)\"}}\nclient.response_headers # =\u003e {\"Server\"=\u003e\"nginx\", \"Date\"=\u003e\"Thu, 06 May 2021 04:52:58 GMT\", \"Content-Type\"=\u003e\"application/json; charset=utf-8\", \"Content-Length\"=\u003e\"179\", \"Connection\"=\u003e\"close\", \"Access-Control-Allow-Origin\"=\u003e\"*\"}\nclient.response_status  # =\u003e 200\nclient.sender_blocked?  # =\u003e false\nclient.sms_cost         # =\u003e nil\nclient.sms_sent?        # =\u003e false\nclient.sms_status       # =\u003e nil\nclient.url              # =\u003e \"https://smspilot.ru/api.php?apikey=1234567890\u0026format=json\u0026send=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%2C+%D0%BC%D0%B8%D1%80%21\u0026to=79021234567\"\n```\n\n### HTTP request failed\n\n```ruby\nclient.api_key          # =\u003e \"YOUR API KEY\"\nclient.balance          # =\u003e nil\nclient.broadcast_id     # =\u003e nil\nclient.error            # =\u003e \"HTTP request failed with code 404\"\nclient.phone            # =\u003e \"79021234567\"\nclient.rejected?        # =\u003e false\nclient.response_body    # =\u003e \"\u003chtml\u003e\\r\\n\u003chead\u003e\u003ctitle\u003e404 Not Found\u003c/title\u003e\u003c/head\u003e\\r\\n\u003cbody\u003e\\r\\n\u003ccenter\u003e\u003ch1\u003e404 Not Found\u003c/h1\u003e\u003c/center\u003e\\r\\n\u003chr\u003e\u003ccenter\u003enginx\u003c/center\u003e\\r\\n\u003c/body\u003e\\r\\n\u003c/html\u003e\\r\\n\"\nclient.response_data    # =\u003e {}\nclient.response_headers # =\u003e {\"Server\"=\u003e\"nginx\", \"Date\"=\u003e\"Thu, 06 May 2021 05:30:23 GMT\", \"Content-Type\"=\u003e\"text/html\", \"Content-Length\"=\u003e\"146\", \"Connection\"=\u003e\"close\"}\nclient.response_status  # =\u003e 404\nclient.sender_blocked?  # =\u003e false\nclient.sms_cost         # =\u003e nil\nclient.sms_sent?        # =\u003e false\nclient.sms_status       # =\u003e nil\nclient.url              # =\u003e \"https://smspilot.ru/api.php?apikey=1234567890\u0026format=json\u0026send=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%2C+%D0%BC%D0%B8%D1%80%21\u0026to=79021234567\"\n```\n\n\n## SMS pilot API docs\n\n- [Web version](https://smspilot.ru/apikey.php) — см. вкладку PHP, в остальных ничего нет\n- [PDF version](https://smspilot.ru/download/SMSPilotRu-HTTP-v1.9.19.pdf) — тут намного подробнее\n- [API error code](https://smspilot.ru/apikey.php#err)\n\n\n## Test API key\n\nhttps://smspilot.ru/apikey.php\n\n```\n\"XXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZXXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZ\"\n```\n\n\n## API response examples\n\nSMS sent:\n\n```json\n{\n  \"balance\": \"11908.50\",\n  \"cost\": \"1.68\",\n  \"send\": [\n    { \"server_id\": \"10000\", \"phone\": \"79021234567\", \"price\": \"1.68\", \"status\": \"0\" }\n  ]\n}\n```\n\nSMS rejected:\n\n```json\n{\n  \"error\": {\n    \"code\": \"400\",\n    \"description\": \"User not found\",\n    \"description_ru\": \"Пользователь не найден\"\n  }\n}\n```\n\n\n## Documentation\n\nSee [structured documentation](https://rubydoc.info/github/sergeypedan/sms-pilot-api-v1/master/SmsPilot/Client) at RubyDoc.\n\n\n## Roadmap\n\n- [ ] Switch to POST to escape 1024 symbolos GET request limit\n- [ ] Switch to result object pattern\n- [ ] Проверка статусов SMS\n- [ ] Проверка баланса\n- [ ] Информация о пользователе\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsergeypedan%2Fsms-pilot-api-v1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsergeypedan%2Fsms-pilot-api-v1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsergeypedan%2Fsms-pilot-api-v1/lists"}