{ "info": { "author": "Nextron", "author_email": "venom14@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# valhallaAPI\n\nThis module allows you to interact with the Valhalla API, retrieve YARA rules in different formats, filter them and write them to disk. You can find more information about Valhalla on [our website](https://www.nextron-systems.com/yara-rule-feed/). The web interface, which doesn't have the filtering features of the Python module and the client, can be accessed [here](https://valhalla.nextron-systems.com/). \n\nIt contains a Python module `valhallaAPI` and a Python command line API client `valhalla-cli`. \n\n# Python Module\n\nThe web API allows you to retrieve the subscribed rules. \n\nThe 3 main functions of the Python module are:\n\n- `get_rules_text()` retrieves rules as text\n- `get_rules_json()` retrieves rules as JSON\n- `get_rule_info()` queries that DB for info on a certain rule (e.g. hashes of samples, AV detection ratio)\n\nThe module provides functions to filter the retrieved YARA rules based on \n- tags\n- score\n- keywords\n- supported YARA version and required YARA modules\n\nIt also allows you to retrieve a filtered rule set that fits the product that you use to apply the rules. For example, you can get a filtered rule set with rules that will run on your `FireEyeEX` appliance by filtering all rules that use feature only available in YARA versions higher than the supported `1.7.0`. \n\nThere are 2 extra functions for special lookups in the Valhalla database (for customers only):\n\n- `get_rule_info` retrieves rule information and all matching sample hashes\n- `get_hash_info` retrieves all rules matching on a certain sha256 hash\n\n## Demo Access\n\nThere is a demo API key that can be used for testing purposes. \n\n```\n1111111111111111111111111111111111111111111111111111111111111111\n```\n\nIt will allow you to retrieve the processed public [signature-base](https://github.com/Neo23x0/signature-base) rule set. \n\nThe key will also allow you to query the rule info for a single rule, which is:\n```\nCasing_Anomaly_ByPass\n```\n\nPlease note that Valhalla has protection mechanisms in place that will block your end of the Bifrost for a significant amount of time if you try foolish things. \n\n## Getting Started\n\n```bash\npip3 install valhallaAPI\n```\n\n## Usage\n\nGet a service status (does not require a valid API key)\n```python\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI()\nstatus = v.get_status()\n```\n\n### Text Rules\n\nGet all subscribed rules as text and save them to a file\n```python\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"Your API Key\")\nresponse = v.get_rules_text()\n\nwith open('valhalla-rules.yar', 'w') as fh:\n fh.write(response)\n```\n\nOr use the DEMO API key, which allows you to retrieve all public rules\n```python\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"1111111111111111111111111111111111111111111111111111111111111111\")\nresponse = v.get_rules_text()\n\nwith open('valhalla-rules.yar', 'w') as fh:\n fh.write(response)\n```\n\nGet all subscribed rules with a minimum score of 75 and save it to a file\n```python\nresponse = v.get_rules_text(score=75)\n```\n\nGet all subscribed rules that contain the keyword `Mimikatz` and save them to a file\n```python\nresponse = v.get_rules_text(search=\"Mimikatz\")\n```\n\nGet all subscribed rules for your scan engine, which suppports YARA up to version `3.2.0` and the `pe` module, and save them to a file\n```python\nresponse = v.get_rules_text(max_version=\"3.2.0\", modules=['pe'])\n```\n\nGet all subscribed rules for your `FireEyeEX`\n```python\n\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"Your API Key\")\nresponse = v.get_rules_text(product=\"FireEyeEX\")\n\n\n```\nGet all subscribed rules for your `Tanium`\n```python\nresponse = v.get_rules_text(product=v.TANIUM)\n```\n\nThe following products have predefined presets\n```python\n FIREEYEAX = \"FireEyeAX\"\n FIREEYENX = \"FireEyeNX\"\n FIREEYEEX = \"FireEyeEX\"\n CARBONBLACK = \"CarbonBlack\"\n TANIUM = \"Tanium\"\n TENABLE = \"Tenable\"\n SYMANTECMAA = \"SymantecMAA\"\n```\n\nAn example response will look like\n```\n/*\n VALHALLA YARA RULE SET\n Retrieved: 2019-02-25 14:54\n Generated for User: a67\n Number of Rules: 8127\n ANY REPRODUCTION OR DISTRIBUTION IS STRICTLY PROHIBITED WITHOUT THE PRIOR WRITTEN CONSENT OF NEXTRON SYSTEMS AND MAY RESULT IN LEGAL ACTION AS WELL AS THE TERMINATION OF THE CONTRACTUAL RELATIONSHIP\n*/\n\nimport \"pe\"\n\nrule SUSP_Katz_PDB_RID664 : EXE SUSP DEMO FILE {\n meta:\n description = \"Detects suspicious PDB in file\"\n author = \"Florian Roth\"\n reference = \"Internal Research\"\n date = \"2019-02-04 10:32:31\"\n score = 70\n customer = \"demo\"\n copyright = \"Distribution to third parties is not permitted and will be pursued with legal measurements\" \n minimum_yara = \"1.7\"\n\n strings:\n $s1 = /\\\\Release\\\\[a-z]{0,8}katz.pdb/ \n $s2 = /\\\\Debug\\\\[a-z]{0,8}katz.pdb/ \n condition: \n uint16 ( 0 ) == 0x5a4d and filesize < 6000KB and all of them\n} \n...\n```\n\n### JSON Output\n\nGet all subscribed rules with the `APT` tag as `JSON` and save them to a file\n```python\nimport json\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"Your API Key\")\nresponse = v.get_rules_json(tags=['APT'])\n\nwith open('valhalla-rules.json', 'w') as fh:\n fh.write(json.dumps(response)) \n```\n\nAn example response will look like\n```json\n{\n \"api_version\": \"1.0\", \n \"copyright\": \"Nextron Systems GmbH\", \n \"customer\": \"demo\", \n \"date\": \"2019-03-07 10:55\", \n \"legal_note\": \"Any reproduction or distribution is strictly prohibited without the prior written consent of Nextron Systems and may result in legal action as well as the termination of the contractual relationship\", \n \"rules\": [\n {\n \"author\": \"Florian Roth\", \n \"content\": \"rule EXP_Libre_Office_CVE_2018_16858_RIDBA9 : EXPLOIT OFFICE DEMO FILE APT {\\n meta:\\n description = \\\"Detects exploits addressing CVE-2018-16858 in LibreOffice - modified version\\\"\\n author = \\\"Florian Roth\\\"\\n reference = \\\"https://insert-script.blogspot.com/2019/02/libreoffice-cve-2018-16858-remote-code.html\\\"\\n date = \\\"2019-02-05 14:17:21\\\"\\n score = 70\\n customer = \\\"demo\\\"\\n copyright = \\\"Distribution to third parties is not permitted and will be pursued with legal measurements\\\" \\n minimum_yara = \\\"1.7\\\"\\n \\n strings:\\n $x1 = \\\"tempfilepager\\\" \\n $x2 = \\\"tempfilepager\\\" \\n $s1 = \\\"xlink:href=\\\\\\\"vnd.sun.star.script:\\\" ascii nocase\\n $s2 = \\\".py$tempfilepager\\\" ascii nocase\\n $s3 = \\\"language=Python\\\" ascii nocase\\n condition: \\n uint32be ( 0 ) == 0x3c3f786d and all of them or 1 of ( $x* )\\n}\", \n \"date\": \"2019-02-05 12:54:31\", \n \"description\": \"Detects exploits addressing CVE-2018-16858 in LibreOffice - modified version\", \n \"minimum_yara\": \"1.7\", \n \"name\": \"EXP_Libre_Office_CVE_2018_16858_RID9B8\", \n \"reference\": \"https://insert-script.blogspot.com/2019/02/libreoffice-cve-2018-16858-remote-code.html\", \n \"required_modules\": [], \n \"score\": 70, \n \"tags\": [\n \"EXPLOIT\", \n \"OFFICE\", \n \"DEMO\", \n \"FILE\",\n \"APT\"\n ]\n }, \n ...\n```\n\n### Rule Info\n\nGet the information for rule `Casing_Anomaly_ByPass`\n```python\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"Your API Key\")\nresponse = v.get_rule_info(rulename=\"Casing_Anomaly_ByPass\")\n```\n\nNote that the rule info for `Casing_Anomaly_ByPass` is the only info that you can retrieve with the DEMO API key. \n\nAn example output of a rule info request will look like\n```json\n{\n \"author\": \"Florian Roth\", \n \"av_ratio\": 16.52, \n \"av_verdicts\": {\n \"clean\": 1, \n \"malicious\": 21, \n \"suspicious\": 27\n }, \n \"date\": \"2019-01-17 11:50:21\", \n \"description\": \"Detects suspicious casing of bypass statement\", \n \"minimum_yara\": \"1.7\", \n \"name\": \"Casing_Anomaly_ByPass_RID837\", \n \"reference\": \"Internal Research\", \n \"required_modules\": [], \n \"rule_matches\": [\n {\n \"hash\": \"bdde03b5b4f94ec7dbf947f3099f2009efac43b69659f788f513d3e615b98353\", \n \"positives\": 24, \n \"size\": 319485, \n \"timestamp\": \"Thu, 07 Mar 2019 06:29:06 GMT\", \n \"total\": 56\n }, \n {\n \"hash\": \"646d446fb11eae76ca8b6e54306bb022431a4f20cc8cef5daa40dd6ec3537aff\", \n \"positives\": 3, \n \"size\": 573, \n \"timestamp\": \"Thu, 07 Mar 2019 00:15:07 GMT\", \n \"total\": 57\n }\n ], \n \"score\": 60, \n \"tags\": [\n \"SUSP\", \n \"CASING\"\n ] \n}\n```\n\n### Hash Info\n\nGet the information for hash `8a883a74702f83a273e6c292c672f1144fd1cce8ee126cd90c95131e870744af`\n```python\nfrom valhallaAPI.valhalla import ValhallaAPI\n\nv = ValhallaAPI(api_key=\"Your API Key\")\nresponse = v.get_rule_info(hash=\"8a883a74702f83a273e6c292c672f1144fd1cce8ee126cd90c95131e870744af\")\n```\n\nAn example output of a hash info request will look like\n```json\n{\n \"api_version\": \"1.0.1\",\n \"results\": [\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_ByPass\",\n \"tags\": [\n \"T1027\",\n \"SUSP\",\n \"CASING\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:10 GMT\",\n \"total\": 58\n },\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_Convert_PS\",\n \"tags\": [\n \"T1027\",\n \"CASING\",\n \"SCRIPT\",\n \"T1064\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:12 GMT\",\n \"total\": 58\n },\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_PowerShell\",\n \"tags\": [\n \"T1027\",\n \"CASING\",\n \"SCRIPT\",\n \"T1064\",\n \"T1086\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:13 GMT\",\n \"total\": 58\n }\n ],\n \"status\": \"success\"\n}\n```\n\n# API Client\n\nThe API client allows you to query the Web API from command line. It requires Python3. \n\n## Getting Started\n\nInstall Python3 and then run the following command:\n\n```bash\npip3 install valhallaAPI\n```\nYou should then be able to run `valhalla-cli` from command line using a Linux or macOS system. \n\nOn Windows, do the following:\n```bash\nwhere valhalla-cli\n```\nCopy the full path and then run \n```bash\npython C:\\Python37\\Scripts\\valhalla-cli\n```\nor just download the precompiled `valhalla-cli.exe` from the latest release in the `release` section. \n\n## Usage\n\n```\nusage: valhalla-cli [-h] [-k apikey] [-o output-file] [--check] [--debug]\n [-p proxy-url] [-pu proxy-user] [-pp proxy-pass]\n [-fp product] [-fv yara-version]\n [-fm modules [modules ...]] [-ft tags [tags ...]]\n [-fs score] [-fq query] [--nocrypto]\n\nValhalla-CLI\n\noptional arguments:\n -h, --help show this help message and exit\n -k apikey API KEY\n -o output-file output file\n --check Check subscription info and total rule count\n --debug Debug output\n\n=======================================================================\nProxy:\n -p proxy-url proxy URL (e.g. https://my.proxy.net:8080)\n -pu proxy-user proxy user\n -pp proxy-pass proxy password\n\n=======================================================================\nFilter:\n -fp product filter product (valid products are: FireEyeAX,\n FireEyeNX, FireEyeEX, CarbonBlack, Tanium, Tenable,\n SymantecMAA)\n -fv yara-version get rules that support the given YARA version and\n lower\n -fm modules [modules ...]\n set a list of modules that your product supports (e.g.\n \"-fm pe hash\") (setting no modules means taht all\n modules are supported by your product)\n -ft tags [tags ...] set a list of tags to receive (e.g. \"-ft APT MAL\")\n -fs score minimum score of rules to retrieve (e.g. \"-fs 75\")\n -fq query get only rules that match a certain keyword in name or\n description (e.g. \"-fq Mimikatz\")\n --nocrypto filter all rules that require YARA to be compiled with\n crypto support (OpenSSL)\n```\n\n## Examples\n\nCheck the status of the demo user subscription\n```bash\nvalhalla-cli --check\n```\n\nCheck the status of your subscription\n```bash\nvalhalla-cli -k YOUR-API-KEY --check\n```\n\nGet all subscribed rules and save them to `valhalla-rules.yar`\n```bash\nvalhalla-cli -k YOUR-API-KEY\n```\n\nGet rules with score higher than 75 and save them to `valhalla-rules.yar`\n```bash\nvalhalla-cli -k YOUR-API-KEY -fs 75\n```\n\nGet rules that work with CarbonBlack and save them to `valhalla-april-cb.yar`\n```bash\nvalhalla-cli -k YOUR-API-KEY -fp CarbonBlack -o valhalla-april-cb.yar\n```\n\nGet rules that contain the keyword `Mimikatz` and save them to `mimikatz-rules.yar`\n```bash\nvalhalla-cli -k YOUR-API-KEY -fq Mimikatz -o mimikatz-rules.yar\n```\n\n# Config File\n\nValhalla-CLI will check `~/.valhalla` as the default location for a config file. \n\nThe config file currently contains nothing but the API key and mus look like:\n\n```ini\n[DEFAULT]\nAPIKEY = 786feaef202a37a8d693c57b1aeb7c8995313e358b901015c4e60033776929c3\n```\n\n# Lookups \n\nValhalla-CLI has certain functions to perform lookups on its database. \n\nThe lookups return JSON output. You can use the `-lo file` option to save the JSON results to a file.\n\n## Hash Lookups\n\nHash lookup can be used to search the Valhalla database for a certain hash (SHA256 only). \n\n```bash\n./valhalla-cli -lh 8a883a74702f83a273e6c292c672f1144fd1cce8ee126cd90c95131e870744af\n```\n\nIt will return a JSON structure. \n\n````json\n{\n \"api_version\": \"1.0.1\",\n \"results\": [\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_ByPass\",\n \"tags\": [\n \"T1027\",\n \"SUSP\",\n \"CASING\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:10 GMT\",\n \"total\": 58\n },\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_Convert_PS\",\n \"tags\": [\n \"T1027\",\n \"CASING\",\n \"SCRIPT\",\n \"T1064\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:12 GMT\",\n \"total\": 58\n },\n {\n \"positives\": 4,\n \"rulename\": \"Casing_Anomaly_PowerShell\",\n \"tags\": [\n \"T1027\",\n \"CASING\",\n \"SCRIPT\",\n \"T1064\",\n \"T1086\"\n ],\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:13 GMT\",\n \"total\": 58\n }\n ],\n \"status\": \"success\"\n}\n````\n\n## Rule Lookups\n\nRule lookups can be used to search the Valhalla database for a certain rule and their matches (premium feature). \n\n```bash\n./valhalla-cli -lr Casing_Anomaly_ByPass\n```\n\nIt will return a JSON structure. \n\n````json\n{\n \"author\": \"Florian Roth\",\n \"av_ratio\": 18.3,\n \"av_verdicts\": {\n \"clean\": 10,\n \"malicious\": 59,\n \"suspicious\": 52\n },\n \"date\": \"2019-01-17 11:50:21\",\n \"description\": \"Detects suspicious casing of bypass statement\",\n \"minimum_yara\": \"1.7\",\n \"name\": \"Casing_Anomaly_ByPass_RID2F47\",\n \"reference\": \"Internal Research\",\n \"required_modules\": [],\n \"rule_hash\": \"69b40d02020addf42cd12d3449933a3f\",\n \"rule_matches\": [\n {\n \"hash\": \"8a883a74702f83a273e6c292c672f1144fd1cce8ee126cd90c95131e870744af\",\n \"positives\": 4,\n \"size\": 5645,\n \"timestamp\": \"Tue, 11 Jun 2019 23:57:10 GMT\",\n \"total\": 58\n },\n {\n \"hash\": \"6999c997b09754fa100779af9d23a005c2a5b8944ee46175857e58e47626de65\",\n \"positives\": 11,\n \"size\": 1830,\n \"timestamp\": \"Tue, 11 Jun 2019 08:46:05 GMT\",\n \"total\": 58\n },\n ],\n \"score\": 60,\n \"tags\": [\n \"T1027\",\n \"SUSP\",\n \"CASING\"\n ]\n}\n````\n\n# Scores\n\nThe following list explains the scores used in the rule set\n\n|Score|Type|Description|\n|-----|----|-----------|\n|1-39|Info|Low scoring rules used in our scanners (excluded from Valhalla, only used in our scanners)|\n|40-59|Noteworthy|Anomaly and threat hunting rules|\n|60-74|Suspicious|Rules for suspicious objects|\n|75-100|Alert|Hard malicious matches|\n\n# Important Notices\n\n- We constantly improve old rules. They may have changed the next time you fetch the rule set. Therefore it is recommended to always fetch a full set and replace older rules with their newer versions. \n- The full rule set contains YARA rules with scores lower than 60, which are meant for threat hunting and anomaly detection use cases. \n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nextron/valhallaAPI", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "valhallaAPI", "package_url": "https://pypi.org/project/valhallaAPI/", "platform": "", "project_url": "https://pypi.org/project/valhallaAPI/", "project_urls": { "Homepage": "https://github.com/nextron/valhallaAPI" }, "release_url": "https://pypi.org/project/valhallaAPI/0.3.0/", "requires_dist": [ "packaging", "requests", "configparser" ], "requires_python": "~=3.5", "summary": "Valhalla API Client", "version": "0.3.0" }, "last_serial": 5395538, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "894e8ffd06da92035c036773575f2bcf", "sha256": "1c3bcc0bdf07f652110e97865791a2914220899661af05591377576eb21cbdf8" }, "downloads": -1, "filename": "valhallaAPI-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "894e8ffd06da92035c036773575f2bcf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 16188, "upload_time": "2019-03-17T11:24:55", "url": "https://files.pythonhosted.org/packages/b8/98/a241cc54c5ab9ca0fc717be7380dde1c6c787c9d76d4c0ce76965cea6164/valhallaAPI-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b22ce75b215d05c23cde9f7bcf6872b", "sha256": "debe0da54e1813fd85bb73355a92ad74b368106eeafa5b8625128e06e33bc51b" }, "downloads": -1, "filename": "valhallaAPI-0.2.0.tar.gz", "has_sig": false, "md5_digest": "2b22ce75b215d05c23cde9f7bcf6872b", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 14583, "upload_time": "2019-03-17T11:24:57", "url": "https://files.pythonhosted.org/packages/3c/92/5d98c324197b8cf94175de499e5c924b69276effdd1595cb6f91f031bc66/valhallaAPI-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "2fba430c3d0ad2e4214b1d15033fbe74", "sha256": "50740cdcbfe11babbe4a4666d69a0c673d056d2dc68fd183cc9c9bbc9cd47726" }, "downloads": -1, "filename": "valhallaAPI-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2fba430c3d0ad2e4214b1d15033fbe74", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16600, "upload_time": "2019-03-29T09:42:41", "url": "https://files.pythonhosted.org/packages/a7/66/d9bdf57c26c054d2d228961974971df006528893c4dc2798792d911dae23/valhallaAPI-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a2f6d107a920a3cf5e063d0daa8811f", "sha256": "f9be8b0df0176aa7b9199ea9f93df1fbe9babce1039483a75214ca0436e10988" }, "downloads": -1, "filename": "valhallaAPI-0.2.1.tar.gz", "has_sig": false, "md5_digest": "4a2f6d107a920a3cf5e063d0daa8811f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15480, "upload_time": "2019-03-29T09:42:43", "url": "https://files.pythonhosted.org/packages/78/f1/0556f35a96caa6e7b65335020266831175b6e06bdcf613504631aadfce0e/valhallaAPI-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "1308b2df3254f309767b9e3c7da4aa2b", "sha256": "53a4c0032f634a5e18dc8010be82aef48adf41c86532ef5fff9dc203ad20239f" }, "downloads": -1, "filename": "valhallaAPI-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1308b2df3254f309767b9e3c7da4aa2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 16383, "upload_time": "2019-03-30T12:33:53", "url": "https://files.pythonhosted.org/packages/e4/f3/20f7e061479ea587fe77fe95540cca77a1eee19acd2f3840b8792e786ee1/valhallaAPI-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23936ccd33584e72e345f3ec6cd9421c", "sha256": "26d8bca823e8f505d525d8b67bbd62d494ce7270c2f715f766e4d14bcd33956c" }, "downloads": -1, "filename": "valhallaAPI-0.2.2.tar.gz", "has_sig": false, "md5_digest": "23936ccd33584e72e345f3ec6cd9421c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 15327, "upload_time": "2019-03-30T12:33:55", "url": "https://files.pythonhosted.org/packages/0f/ae/f3df63056723867face573f5f3d1f24f783f24b6a928869df221556f1403/valhallaAPI-0.2.2.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "203335448a2a93e77998527e169c83a8", "sha256": "7405eee83d237df8f7108b2a31de57cd6ebf8b108f9cee5a0f6bb565d7b1f2f0" }, "downloads": -1, "filename": "valhallaAPI-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "203335448a2a93e77998527e169c83a8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 16603, "upload_time": "2019-04-02T14:27:47", "url": "https://files.pythonhosted.org/packages/97/a9/332cabf91b03129963819563615cf6c75c3150ccf6cbc955844febf73f1b/valhallaAPI-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ffdd6a5965490a8fb496b69dce4b5790", "sha256": "b24653fa09ac280c7673ae1647328e3d1008b0e09fcbbcf33de9c083eb5db99b" }, "downloads": -1, "filename": "valhallaAPI-0.2.4.tar.gz", "has_sig": false, "md5_digest": "ffdd6a5965490a8fb496b69dce4b5790", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 15580, "upload_time": "2019-04-02T14:27:48", "url": "https://files.pythonhosted.org/packages/43/b7/1052a96268e028c3fd9a923b18b3ba7364c5d9a3f9abac14eb7801376f00/valhallaAPI-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "78b605b88c40239ab07503cc96aba2ac", "sha256": "457c6f8163c38ab2238ec938e74f306043dbd75bedc734244c2f2b2f0808b20f" }, "downloads": -1, "filename": "valhallaAPI-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "78b605b88c40239ab07503cc96aba2ac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 16683, "upload_time": "2019-04-04T14:37:40", "url": "https://files.pythonhosted.org/packages/c4/ae/548b8d1941f544b01a5e689fac9e61a28983825662d4758992f9d6acde57/valhallaAPI-0.2.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "095d393eb030bf203971449315500c1a", "sha256": "2ef4c85c75d5c08ffbc914ea730784c2bd2e5fe58c0b25f30122312629c5305f" }, "downloads": -1, "filename": "valhallaAPI-0.2.5.tar.gz", "has_sig": false, "md5_digest": "095d393eb030bf203971449315500c1a", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 15647, "upload_time": "2019-04-04T14:37:41", "url": "https://files.pythonhosted.org/packages/0a/58/0a156699018c15caef5b4f9ebd65aab91658674a8182d49fd615da351339/valhallaAPI-0.2.5.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "0dcc60c011d690258a7bc570dbc1b9a2", "sha256": "3de5e82490638b1c1db62aa0f772bcf790e1288a178c3e2a480b327be251e4d3" }, "downloads": -1, "filename": "valhallaAPI-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0dcc60c011d690258a7bc570dbc1b9a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 18463, "upload_time": "2019-06-13T11:38:10", "url": "https://files.pythonhosted.org/packages/50/0d/c7f3c737474022b4c804c32cec0faf07ded20a04788cbe98a9ec5c81520a/valhallaAPI-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2569a2d39d9a62d8e82254819935d56", "sha256": "eef2f5c30afc24df17b3b9a0daaf792ff45f84b3c27b064d90564084fd90fb5f" }, "downloads": -1, "filename": "valhallaAPI-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d2569a2d39d9a62d8e82254819935d56", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 18714, "upload_time": "2019-06-13T11:38:12", "url": "https://files.pythonhosted.org/packages/fe/ac/f7b4d1ff804e598853c7d28d05362d0d24fa7ea584b90b493c9f5219109b/valhallaAPI-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0dcc60c011d690258a7bc570dbc1b9a2", "sha256": "3de5e82490638b1c1db62aa0f772bcf790e1288a178c3e2a480b327be251e4d3" }, "downloads": -1, "filename": "valhallaAPI-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0dcc60c011d690258a7bc570dbc1b9a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.5", "size": 18463, "upload_time": "2019-06-13T11:38:10", "url": "https://files.pythonhosted.org/packages/50/0d/c7f3c737474022b4c804c32cec0faf07ded20a04788cbe98a9ec5c81520a/valhallaAPI-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2569a2d39d9a62d8e82254819935d56", "sha256": "eef2f5c30afc24df17b3b9a0daaf792ff45f84b3c27b064d90564084fd90fb5f" }, "downloads": -1, "filename": "valhallaAPI-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d2569a2d39d9a62d8e82254819935d56", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.5", "size": 18714, "upload_time": "2019-06-13T11:38:12", "url": "https://files.pythonhosted.org/packages/fe/ac/f7b4d1ff804e598853c7d28d05362d0d24fa7ea584b90b493c9f5219109b/valhallaAPI-0.3.0.tar.gz" } ] }