{"id":18317474,"url":"https://github.com/telegram-mini-apps/init-data-golang","last_synced_at":"2025-12-15T03:35:43.437Z","repository":{"id":60581265,"uuid":"544078443","full_name":"Telegram-Mini-Apps/init-data-golang","owner":"Telegram-Mini-Apps","description":"Golang library to make work with Telegram Mini Apps init data easier.","archived":false,"fork":false,"pushed_at":"2025-03-09T14:54:31.000Z","size":41,"stargazers_count":74,"open_issues_count":0,"forks_count":12,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-02T06:09:35.356Z","etag":null,"topics":["go","golang","telegram","telegram-mini-apps"],"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/Telegram-Mini-Apps.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}},"created_at":"2022-10-01T15:32:45.000Z","updated_at":"2025-03-26T00:17:30.000Z","dependencies_parsed_at":"2023-09-17T19:37:54.661Z","dependency_job_id":"92f8c312-4b7d-48c7-b15c-f0df5ac20ea7","html_url":"https://github.com/Telegram-Mini-Apps/init-data-golang","commit_stats":{"total_commits":30,"total_committers":3,"mean_commits":10.0,"dds":0.06666666666666665,"last_synced_commit":"aea9e8dda5711da5e64d7767dc50f6750ae36c49"},"previous_names":["telegram-mini-apps/init-data-golang","telegram-web-apps/init-data-golang"],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telegram-Mini-Apps%2Finit-data-golang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telegram-Mini-Apps%2Finit-data-golang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telegram-Mini-Apps%2Finit-data-golang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telegram-Mini-Apps%2Finit-data-golang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Telegram-Mini-Apps","download_url":"https://codeload.github.com/Telegram-Mini-Apps/init-data-golang/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247994122,"owners_count":21030050,"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":["go","golang","telegram","telegram-mini-apps"],"created_at":"2024-11-05T18:06:14.739Z","updated_at":"2025-12-15T03:35:43.411Z","avatar_url":"https://github.com/Telegram-Mini-Apps.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# init-data-golang\n\nThe package that provides utilities to work with\nthe [initialization data](https://docs.telegram-mini-apps.com/platform/init-data) of Telegram Mini\nApps.\n\n## Installation\n\n```bash\ngo get github.com/telegram-mini-apps/init-data-golang\n```\n\n## Validation\n\nIf the expiration time is set to `0`, the function will skip the expiration time check. However, it\nis recommended to specify a non-zero value, as this check is considered important in preventing the\nusage of old stolen initialization data.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\tinitdata \"github.com/telegram-mini-apps/init-data-golang\"\n)\n\nfunc main() {\n\t// Init data in raw format.\n\tinitData := \"user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%20%2B%20-%20%3F%20%5C%2F%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%2C%22photo_url%22%3A%22https%3A%5C%2F%5C%2Ft.me%5C%2Fi%5C%2Fuserpic%5C%2F320%5C%2F4FPEE4tmP3ATHa57u6MqTDih13LTOiMoKoLDRG4PnSA.svg%22%7D\u0026chat_instance=8134722200314281151\u0026chat_type=private\u0026auth_date=1733509682\u0026signature=TYJxVcisqbWjtodPepiJ6ghziUL94-KNpG8Pau-X7oNNLNBM72APCpi_RKiUlBvcqo5L-LAxIc3dnTzcZX_PDg\u0026hash=a433d8f9847bd6addcc563bff7cc82c89e97ea0d90c11fe5729cae6796a36d73\"\n\n\t// Telegram Bot secret key.\n\ttoken := \"7342037359:AAHI25ES9xCOMPokpYoz-p8XVrZUdygo2J4\"\n\n\t// Define how long since init data generation date init data is valid.\n\texpIn := 24 * time.Hour\n\n\t// Will return error in case, init data is invalid.\n\tfmt.Println(initdata.Validate(initData, token, expIn))\n}\n\n```\n\n### Third-Party Validation\n\nThe package allows validating init data to check if it was signed by Telegram.\n\nTo do so, call the `ValidateThirdParty` function with the following arguments:\n\n- `initData: string`: Init data in raw format.\n- `botID: int64`: The Telegram Bot issuer identifier for the init data.\n- `expIn: time.Time`: The maximum lifetime of the init data.\n\nHere is an example:\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\tinitdata \"github.com/telegram-mini-apps/init-data-golang\"\n)\n\nfunc main() {\n\t// Init data in raw format.\n\tinitData := \"user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%20%2B%20-%20%3F%20%5C%2F%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%2C%22photo_url%22%3A%22https%3A%5C%2F%5C%2Ft.me%5C%2Fi%5C%2Fuserpic%5C%2F320%5C%2F4FPEE4tmP3ATHa57u6MqTDih13LTOiMoKoLDRG4PnSA.svg%22%7D\u0026chat_instance=8134722200314281151\u0026chat_type=private\u0026auth_date=1733584787\u0026hash=2174df5b000556d044f3f020384e879c8efcab55ddea2ced4eb752e93e7080d6\u0026signature=zL-ucjNyREiHDE8aihFwpfR9aggP2xiAo3NSpfe-p7IbCisNlDKlo7Kb6G4D0Ao2mBrSgEk4maLSdv6MLIlADQ\"\n\n\t// Telegram Bot secret key.\n\tvar botID int64 = 7342037359\n\n\t// Define how long since init data generation date init data is valid.\n\texpIn := 24 * time.Hour\n\n\t// Will return an error if init data is invalid.\n\tfmt.Println(initdata.ValidateThirdParty(initData, botID, expIn))\n}\n```\n\nYou can also use the `ValidateThirdPartyWithEnv` function with the additional boolean\nargument responsible for marking the environment as the testing one. \n\n## Parsing\n\nIt is important to note that the `Parse` function does not perform the same checks as the `Validate`\nfunction. Therefore, this function solely parses incoming data without conducting validations for\nthe hash or expiration time.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\tinitdata \"github.com/telegram-mini-apps/init-data-golang\"\n)\n\nfunc main() {\n\t// Init data in raw format.\n\tinitData := \"user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%20%2B%20-%20%3F%20%5C%2F%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%2C%22photo_url%22%3A%22https%3A%5C%2F%5C%2Ft.me%5C%2Fi%5C%2Fuserpic%5C%2F320%5C%2F4FPEE4tmP3ATHa57u6MqTDih13LTOiMoKoLDRG4PnSA.svg%22%7D\u0026chat_instance=8134722200314281151\u0026chat_type=private\u0026auth_date=1733509682\u0026signature=TYJxVcisqbWjtodPepiJ6ghziUL94-KNpG8Pau-X7oNNLNBM72APCpi_RKiUlBvcqo5L-LAxIc3dnTzcZX_PDg\u0026hash=a433d8f9847bd6addcc563bff7cc82c89e97ea0d90c11fe5729cae6796a36d73\"\n\n\t// Will return 2 values.\n\t// 1. InitData instance if passed data has a correct format.\n\t// 2. Error in case, something is wrong. \n\tfmt.Println(initdata.Parse(initData))\n}\n\n```\n\n## Signing\n\nThe functions that sign data remove parameters such as `hash` and `auth_date` since it is assumed\nthat the `hash` will be returned by the function and the `auth_date` will be set by the function\nitself.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\tinitdata \"github.com/telegram-mini-apps/init-data-golang\"\n)\n\nfunc main() {\n\t// Init data in raw format.\n\tinitData := \"user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%20%2B%20-%20%3F%20%5C%2F%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%2C%22photo_url%22%3A%22https%3A%5C%2F%5C%2Ft.me%5C%2Fi%5C%2Fuserpic%5C%2F320%5C%2F4FPEE4tmP3ATHa57u6MqTDih13LTOiMoKoLDRG4PnSA.svg%22%7D\u0026chat_instance=8134722200314281151\u0026chat_type=private\u0026auth_date=1733509682\u0026signature=TYJxVcisqbWjtodPepiJ6ghziUL94-KNpG8Pau-X7oNNLNBM72APCpi_RKiUlBvcqo5L-LAxIc3dnTzcZX_PDg\u0026hash=a433d8f9847bd6addcc563bff7cc82c89e97ea0d90c11fe5729cae6796a36d73\"\n\n\t// Telegram Bot secret key.\n\ttoken := \"7342037359:AAHI25ES9xCOMPokpYoz-p8XVrZUdygo2J4\"\n\n\t// Signing timestamp.\n\t// Here we took the value from the initData variable\n\t// above (auth_date query parameter).\n\tauthDate := time.Unix(1733509682, 0)\n\n\t// Signing query parameters.\n\t// Returned values:\n\t// 1. Parameters sign result (\"hash\" init data property).\n\t// 2. Error occurring while parsing query string as query parameters.\n\tfmt.Println(initdata.SignQueryString(initData, token, authDate))\n\n\t// Signing the same query parameters presented as a map.\n\tfmt.Println(initdata.Sign(map[string]string{\n\t\t\"user\":          \"{\\\"id\\\":279058397,\\\"first_name\\\":\\\"Vladislav + - ? \\\\/\\\",\\\"last_name\\\":\\\"Kibenko\\\",\\\"username\\\":\\\"vdkfrost\\\",\\\"language_code\\\":\\\"ru\\\",\\\"is_premium\\\":true,\\\"allows_write_to_pm\\\":true,\\\"photo_url\\\":\\\"https:\\\\/\\\\/t.me\\\\/i\\\\/userpic\\\\/320\\\\/4FPEE4tmP3ATHa57u6MqTDih13LTOiMoKoLDRG4PnSA.svg\\\"}\",\n\t\t\"chat_instance\": \"8134722200314281151\",\n\t\t\"chat_type\":     \"private\",\n\t\t\"signature\":     \"TYJxVcisqbWjtodPepiJ6ghziUL94-KNpG8Pau-X7oNNLNBM72APCpi_RKiUlBvcqo5L-LAxIc3dnTzcZX_PDg\",\n\t}, token, authDate))\n\n\t// In the console, you should see the same results.\n}\n\n```\n\n## GoDoc\n\nTo see GoDoc documentation,\nvisit [this link](https://pkg.go.dev/github.com/telegram-mini-apps/init-data-golang).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelegram-mini-apps%2Finit-data-golang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftelegram-mini-apps%2Finit-data-golang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelegram-mini-apps%2Finit-data-golang/lists"}