{"id":17995819,"url":"https://github.com/doubangotelecom/ultimatemrz-sdk","last_synced_at":"2025-04-04T08:06:56.524Z","repository":{"id":43331722,"uuid":"208035900","full_name":"DoubangoTelecom/ultimateMRZ-SDK","owner":"DoubangoTelecom","description":"Machine-readable zone/travel document (MRZ / MRTD) detector and recognizer using deep learning","archived":false,"fork":false,"pushed_at":"2025-03-02T06:36:41.000Z","size":230803,"stargazers_count":190,"open_issues_count":2,"forks_count":54,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-03-28T07:08:48.903Z","etag":null,"topics":["ai","android","android-app","artificial-intelligence","deep-learning","machine-learning","mrtd","mrz","mrz-lines","ocr","raspberry-pi","sdk","tesseract-ocr","ultimatemrz-sdk"],"latest_commit_sha":null,"homepage":"https://www.doubango.org/webapps/mrz/","language":"C++","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/DoubangoTelecom.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":"2019-09-12T11:31:55.000Z","updated_at":"2025-03-17T20:08:33.000Z","dependencies_parsed_at":"2024-10-24T22:12:56.878Z","dependency_job_id":null,"html_url":"https://github.com/DoubangoTelecom/ultimateMRZ-SDK","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2FultimateMRZ-SDK","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2FultimateMRZ-SDK/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2FultimateMRZ-SDK/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoubangoTelecom%2FultimateMRZ-SDK/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DoubangoTelecom","download_url":"https://codeload.github.com/DoubangoTelecom/ultimateMRZ-SDK/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247142063,"owners_count":20890652,"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":["ai","android","android-app","artificial-intelligence","deep-learning","machine-learning","mrtd","mrz","mrz-lines","ocr","raspberry-pi","sdk","tesseract-ocr","ultimatemrz-sdk"],"created_at":"2024-10-29T21:11:40.573Z","updated_at":"2025-04-04T08:06:56.504Z","avatar_url":"https://github.com/DoubangoTelecom.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿ - [Sample applications](#Sample-applications)\n    - [Video Recognizer](#Sample-applications-Video-Recognizer)\n    - [Benchmark](#Sample-applications-Benchmark)\n    - [Parser](#Sample-applications-Parser)\n    - [Validation](#Sample-applications-Validation)\n    - [Trying the samples](#Sample-applications-Trying-the-samples)\n      - [Android](#Sample-applications-Trying-the-samples-Android)\n      - [iOS](#Sample-applications-Trying-the-samples-iOS)\n      - [Windows](#Sample-applications-Trying-the-samples-Windows)\n      - [Raspberry Pi, Linux and Others](#Sample-applications-Trying-the-samples-Raspberry-Pi-and-Others)\n- [Getting-started](#Getting-started)\n  - [Adding the SDK to your project](#Getting-started-Adding-the-SDK-to-your-project)\n    - [Android](#Getting-started-Adding-the-SDK-to-your-project-Android)\n    - [iOS](#Getting-started-Adding-the-SDK-to-your-project-iOS)\n    - [Raspberry Pi, Linux, Windows and Others](#Getting-started-Adding-the-SDK-to-your-project-Raspberry-Pi-Windows-and-Others)\n   - [Using the API](#Getting-started-Using-the-API)\n     - [Android (Java)](#Getting-started-Using-the-API-Android-Java)\n     - [iOS, Windows, Raspberry Pi, Linux and Others (C++)](#Getting-started-Using-the-API-iOS-Windows-Raspberry-Pi-and-Others-Cpp)\n - [Getting help](#technical-questions)\n  \n - Full documentation at https://www.doubango.org/SDKs/mrz/docs/\n - Online demo at https://www.doubango.org/webapps/mrz/\n - Open source Computer Vision library: https://github.com/DoubangoTelecom/compv\n  \n\u003chr /\u003e\n\nThis is state-of-the-art [Machine Readable Zone / Travel Documents (MRZ / MRTD)](https://en.wikipedia.org/wiki/Machine-readable_passport) dectector and recognizer using **deep learning**.\n\nUnlike other solutions you can find on the web, you don't need to adjust the camera/image to define a Region Of Interest (ROI). \nWe also don't try to use small ROI to decrease the processing time or false-positives. The whole image (**up to 4K supported**) is processed and every pixel is checked. \nNo matter if the MRZ lines are **small**, **far away**, **blurred**, **partially occluded**, **skewed** or **slanted**, our implementation can accurately detect and recognize every character.\n\nThe detector is agnostic and doesn't decode (recognize/OCR) the text to check it against some pre-defined rules (regular expressions) which means **we support all MRZ types** (Travel Documents 1/2/3, MRVA, MRVB...) regardless the font, content, shape or country.\nYou can use our implementation to extract information from **local identity cards**, **passports**, **enhanced driver licenses**, **visas**, **resident cards**... \n\nIn addition to being highly accurate our implementation is very fast and can run at up to **50fps on ARM devices** (iPhone7) and **114fps on x86_64** (Core i7-4790K) using HD images (**720p**). See [benchmark section](https://www.doubango.org/SDKs/mrz/docs/Benchmark.html) for more information.\n\nNext [video](https://youtu.be/AO5XdbLK9Do) ([https://youtu.be/AO5XdbLK9Do](https://youtu.be/AO5XdbLK9Do)) shows [VideoRecognizer sample](#Sample-applications-Video-Recognizer) Running on Android: \u003cbr /\u003e\n[![VideoRecognizer Running on Android](https://www.doubango.org/SDKs/mrz/docs/_images/Screenshot_20191231-160311_MrzVideoRecognizer.jpg)](https://www.youtube.com/watch?v=AO5XdbLK9Do)\n   \n\u003chr /\u003e\n\nThe Github repository contains the SDK binaries for **Android**, **iOS**, **Raspberry Pi** and **Windows**. You can contact us if you want binaries for other platforms.\n\nDon't take our word for it, come check our implementation. **No registration, license key or internet connection is needed**, just clone the code and start coding/testing. \nEverything runs on the device, no data is leaving your computer. \nThe code released on [Github](https://github.com/DoubangoTelecom/ultimateMRZ-SDK) comes with many ready-to-use samples to help you get started easily. \n\nYou can also check our online cloud-based implementation (no registration required) at  https://www.doubango.org/webapps/mrz/ to check out the accuracy and precision before starting to play with the SDK.\n\n - Github repo: https://github.com/DoubangoTelecom/ultimateMRZ-SDK\n - Cloud-based implementation: https://www.doubango.org/webapps/mrz/\n \n \n\u003ca name=\"Sample-applications\"\u003e\u003c/a\u003e\n# Sample applications # \nThe source code comes with #4 sample applications: [Benchmark](samples/c++/Benchmark), [VideoRecognizer](samples/c++/recognizer), [Parser](samples/c++/parser) and [Validation](samples/c++/validation). All sample applications are open source and don’t require registration or license key.\n\nThe source code is at [samples](samples).\n\n\u003ca name=\"Sample-applications-Video-Recognizer\"\u003e\u003c/a\u003e\n## Video Recognizer ##\nThis application should be used as reference implementation by any developer trying to add ultimateMRZ to their products. \nIt shows how to detect and recognize MRZ lines at realtime using live video stream from the camera.\n - For **iOS**, a sample with user interface could be found at [samples/iOS/VideoRecognizer](samples/ios/VideoRecognizer)\n - For **Android**, a sample with user interface could be found at [samples/Android/VideoRecognizer](samples/android/videorecognizer)\n - For **Raspberry Pi, Windows and Others** a C++ command line application could be found at [samples/c++/recognizer](samples/c++/recognizer)\n \n\u003ca name=\"Sample-applications-Benchmark\"\u003e\u003c/a\u003e\n## Benchmark ##\nThis application is used to check everything is ok and running as fast as expected. \nThe information about the maximum frame rate (**50fps** on iPhone7 and **114fps** on core i7) could be checked using this application.\n - For **iOS**, a sample with user interface could be found at [samples/iOS/Benchmark](samples/ios/Benchmark)\n - For **Android**, a sample with user interface could be found at [samples/Android/Benchmark](samples/android/benchmark)\n - For **Raspberry Pi, Linux, Windows and Others** a C++ command line application could be found at [samples/c++/benchmark](samples/c++/benchmark)\n\n\u003ca name=\"Sample-applications-Parser\"\u003e\u003c/a\u003e\n## Parser ##\nThis is a C++ sample application using regular expressions to extract the MRZ fields. If you want to extract the expiry date, document number, holder's name or birth date then, this is the right application. \nMore info about the parser: https://www.doubango.org/SDKs/mrz/docs/MRZ_parser.html\n\n\u003ca name=\"Sample-applications-Validation\"\u003e\u003c/a\u003e\n## Validation ##\nMRZ lines contains check digits to validate the field. This C++ sample application shows how to validate the MRZ fields to make sure the OCR result from the recognizer is valid. \nUsing the confidence score and validation process allows reaching **100% accuracy**.\n\nMore info about data validation: https://www.doubango.org/SDKs/mrz/docs/Data_validation.html\n\n\u003ca name=\"Sample-applications-Trying-the-samples\"\u003e\u003c/a\u003e\n## Trying the samples ##\n\n\u003ca name=\"Sample-applications-Trying-the-samples-Android\"\u003e\u003c/a\u003e\n### Android ###\n\nTo try the sample applications on Android:\n- Open Android Studio and select **Open an existing Android Studio project**\n    ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/android_studio_open_existing_project.jpg \"Open an existing Android Studio project\")\n   \n - Navigate to [**\u003cultimateMRZ-SDK\u003e/samples**](samples), select **android** folder and click **Open**\n    ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/android_studio_select_samples_android.jpg \"Select project\")\n\n- Select the sample you want to try (e.g. **videorecognize**), the device (e.g. **samsung SM-G975F**) and press **run**\n    ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/android_studio_select_samples_videorecognizer.jpg \"Select sample\")\n\n\u003ca name=\"Sample-applications-Trying-the-samples-iOS\"\u003e\u003c/a\u003e\n### iOS ###\n\nTo try the sample applications on iOS just open the corresponding Xcode project. \nFor example, the Xcode project for the VideoRecognizer sample is at [ultimateMRZ-SDK/samples/ios/VideoRecognizer/VideoRecognizer.xcodeproj](samples/ios/VideoRecognizer/VideoRecognizer.xcodeproj)\n\n\u003ca name=\"Sample-applications-Trying-the-samples-Windows\"\u003e\u003c/a\u003e\n### Windows ###\nTo try the sample applications on iOS just open the corresponding Visual Studio project. \nFor example, the VS project for the VideoRecognizer sample is at [samples/c++/recognizer/recognizer.vcxproj](samples/c++/recognizer/recognizer.vcxproj).\n\n\u003ca name=\"Sample-applications-Trying-the-samples-Raspberry-Pi-and-Others\"\u003e\u003c/a\u003e\n### Raspberry Pi Linux, and Others ###\nFor Raspberry Pi and other Linux systems you need to build the sample applications from source. More info at [samples/c++/README.md](samples/c++/README.md).\n\n\n\n\u003ca name=\"Getting-started\"\u003e\u003c/a\u003e\n# Getting started # \nThe SDK works on [many platforms](https://www.doubango.org/SDKs/mrz/docs/Architecture_overview.html#supportedoperatingsystems) and comes with support for many [programming languages](https://www.doubango.org/SDKs/mrz/docs/Architecture_overview.html#supportedprogramminglanguages). \n\n\u003ca name=\"Getting-started-Adding-the-SDK-to-your-project\"\u003e\u003c/a\u003e\n## Adding the SDK to your project ##\nThis Github repository contains [binaries](binaries) for **Android**, **iOS**, **Raspberry Pi**, **Linux** and **Windows**. The next sections explain how to add the SDK to an existing project.\n\n\u003ca name=\"Getting-started-Adding-the-SDK-to-your-project-Android\"\u003e\u003c/a\u003e\n### Android ###\nThe SDK is distributed as an Android Studio module and you can add it as reference or you can also build it and add the AAR to your project. But, the easiest way to add the SDK to your project is by directly including the source.\nIn your **build.gradle** file add:\n```python\nandroid {\n\n      # This is the block to add within \"android { } \" section\n      sourceSets {\n         main {\n             jniLibs.srcDirs += ['path-to-your-ultimateMRZ-SDK/binaries/android/jniLibs']\n             java.srcDirs += ['path-to-your-ultimateMRZ-SDK/java/android']\n             assets.srcDirs += ['path-to-your-ultimateMRZ-SDK/assets/models']\n         }\n      }\n}\n```\n\n\u003ca name=\"Getting-started-Adding-the-SDK-to-your-project-iOS\"\u003e\u003c/a\u003e\n### iOS ###\nOn iOS we provide a [FAT C++ framework](binaries/ios/ultimate_mrz-sdk.framework) for Xcode. \nThe framework has a single C++ header file which means you can easily write an Obj-C wrapper around it if you want to use Swift language. \nPlease contact us if you want to use the framework with Swift.\n\nThe framework is at [binaries/ios/ultimate_mrz-sdk.framework](binaries/ios/ultimate_mrz-sdk.framework).\n\nMake sure you're using latest Xcode version. In the next sections we're using **Xcode Version 11.3 (11C29)**.\n\n- Select your target (let's say **Test**), select **General** section then, **Framework, Libraries, and Embedded Content** and press **+** to browse to [binaries/ios/ultimate_mrz-sdk.framework](binaries/ios/ultimate_mrz-sdk.framework) to add the framework. \n ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/ios_xcode_select_framework.jpg \"Select framework\")\n\n- Select your target (let's say **Test**), select **Build Settings** section then, **Framework Search Paths** and press **+** to add path to the folder containing the framework (should be [**ultimateMRZ-SDK/binaries/ios**](binaries/ios))\n ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/ios_xcode_search_path.jpg \"Add framework to search path\")\n\n- Right click on your project, select **Add Files to...** and browse to [**ultimateMRZ-SDK/assets**](assets)  to select [**models**](assets/models) the folder.\n ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/ios_add_files.jpg \"Add files\")\n\n    The previous action should add the models and configuration files to the bundle resources:\n       ![alt text](https://www.doubango.org/SDKs/mrz/docs/_images/ios_models.jpg \"Add models\")\n\nThat's it.\n\n\u003ca name=\"Getting-started-Adding-the-SDK-to-your-project-Raspberry-Pi-Windows-and-Others\"\u003e\u003c/a\u003e\n### Raspberry Pi, Linux, Windows and Others ###\n\nThe shared libraries are under [**ultimateMRZ-SDK/binaries/\u003cplatform\u003e**](binaries). The header file at [c++](c++). You can use any C++ compiler/linker.\n\n\u003ca name=\"Getting-started-Using-the-API\"\u003e\u003c/a\u003e\n## Using the API ##\n\nIt's hard to be lost when you try to use the API as there are only 3 useful functions: init, process and deInit.\n\nThe C++ API is defined at https://www.doubango.org/SDKs/mrz/docs/cpp-api.html.\n\n\u003ca name=\"Getting-started-Using-the-API-Android-Java\"\u003e\u003c/a\u003e\n### Android (Java) ###\n```java\n\timport org.doubango.ultimateMrz.Sdk.ULTMRZ_SDK_IMAGE_TYPE;\n\timport org.doubango.ultimateMrz.Sdk.UltMrzSdkEngine;\n\timport org.doubango.ultimateMrz.Sdk.UltMrzSdkResult;\n\n\t// JSON configuration string\n\t// More info at https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html\n\tfinal static String CONFIG = \"{\" +\n\t\t\"\\\"debug_level\\\": \\\"info\\\",\" + \n\t\t\"\\\"debug_write_input_image_enabled\\\": false,\" + \n\t\t\"\\\"debug_internal_data_path\\\": \\\".\\\",\" + \n\t\t\"\" + \n\t\t\"\\\"num_threads\\\": -1,\" + \n\t\t\"\\\"gpgpu_enabled\\\": true,\" + \n\t\t\"\\\"gpgpu_workload_balancing_enabled\\\": true,\" + \n\t\t\"\" + \n\t\t\"\\\"segmenter_accuracy\\\": \\\"high\\\",\" + \n\t\t\"\\\"interpolation\\\": \\\"bilinear\\\",\" + \n\t\t\"\\\"min_num_lines\\\": 2,\" + \n\t\t\"\\\"roi\\\": [0, 0, 0, 0],\" + \n\t\t\"\\\"min_score\\\": 0.0\" + \n\t\"}\";\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\t\n\n\t\t// Initialize the engine\n\t\tassert UltMrzSdkEngine.init(\n\t\t\t\tgetAssets(),\n\t\t\t\tCONFIG\n\t\t).isOK();\n\t}\n\n\t// Camera listener: https://developer.android.com/reference/android/media/ImageReader.OnImageAvailableListener\n\tfinal ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {\n\n\t\t@Override\n\t\tpublic void onImageAvailable(ImageReader reader) {\n\t\t\t\ttry {\n\t\t\t\t    final Image image = reader.acquireLatestImage();\n\t\t\t\t    if (image == null) {\n\t\t\t\t        return;\n\t\t\t\t    }\n\n\t\t\t\t    // MRZ recognition\n\t\t\t\t    final int exifOrientation = 1; // Normal (landscape) - no rotation\n\t\t\t\t    final Image.Plane[] planes = image.getPlanes();\n\t\t\t\t    final UltMrzSdkResult result = UltMrzSdkEngine.process(\n\t\t\t\t        ULTMRZ_SDK_IMAGE_TYPE.ULTMRZ_SDK_IMAGE_TYPE_YUV420P,\n\t\t\t\t        planes[0].getBuffer(),\n\t\t\t\t        planes[1].getBuffer(),\n\t\t\t\t        planes[2].getBuffer(),\n\t\t\t\t        image.getWidth(),\n\t\t\t\t        image.getHeight(),\n\t\t\t\t        planes[0].getRowStride(),\n\t\t\t\t        planes[1].getRowStride(),\n\t\t\t\t        planes[2].getRowStride(),\n\t\t\t\t        planes[1].getPixelStride(),\n\t\t\t\t        exifOrientation\n\t\t\t\t    );\n\t\t\t\t    assert result.isOK();\n\n\t\t\t\t    image.close();\n\n\t\t\t\t} catch (final Exception e) {\n\t\t\t\t   e.printStackTrace();\n\t\t\t\t}\n\t\t}\n\t};\n\n\t@Override\n\tpublic void onDestroy() {\n\t\t// DeInitialize the engine\n\t\tassert UltMrzSdkEngine.deInit().isOK();\n\n\t\tsuper.onDestroy();\n\t}\n ```\n \n \u003ca name=\"Getting-started-Using-the-API-iOS-Windows-Raspberry-Pi-and-Others-Cpp\"\u003e\u003c/a\u003e\n ### iOS, Windows, Raspberry Pi, Linux and Others (C++) ###\n\n```cpp\n\t#include \u003cultimateMRZ-SDK-API-PUBLIC.h\u003e // C++ API: https://www.doubango.org/SDKs/mrz/docs/cpp-api.html\n\t\n\t// JSON configuration string\n\t// More info at https://www.doubango.org/SDKs/mrz/docs/Configuration_options.html\n\tstatic const char* __jsonConfig =\n\t\"{\"\n\t\"\\\"debug_level\\\": \\\"info\\\",\"\n\t\"\\\"debug_write_input_image_enabled\\\": false,\"\n\t\"\\\"debug_internal_data_path\\\": \\\".\\\",\"\n\t\"\"\n\t\"\\\"num_threads\\\": -1,\"\n\t\"\\\"gpgpu_enabled\\\": true,\"\n\t#if defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) || defined(__TARGET_ARCH_THUMB) || defined(_ARM) || defined(_M_ARM) || defined(_M_ARMT) || defined(__arm) || defined(__aarch64__)\n\t\"\\\"gpgpu_workload_balancing_enabled\\\": true,\"\n\t#else // Disable GPGPU/CPU work balancing on x86 and enable it on ARM -\u003e https://devtalk.nvidia.com/default/topic/494659/execute-kernels-without-100-cpu-busy-wait-/\n\t\"\\\"gpgpu_workload_balancing_enabled\\\": false,\"\n\t#endif\n\t\"\"\n\t\"\\\"segmenter_accuracy\\\": \\\"high\\\",\"\n\t\"\\\"interpolation\\\": \\\"bilinear\\\",\"\n\t\"\\\"min_num_lines\\\": 2,\"\n\t\"\\\"roi\\\": [0, 0, 0, 0],\"\n\t\"\\\"min_score\\\": 0.0\"\n\t\"}\";\n\n\t// Local variable\n\tUltMrzSdkResult result(0, \"OK\", \"{}\");\n\n\t// Initialize the engine (should be done once)\n\tULTMRZ_SDK_ASSERT((result = UltMrzSdkEngine::init(\n\t\t__jsonConfig\n\t)).isOK());\n\n\t// Processing (detection + recognition)\n\t// Call this function for every video frame\n\tconst void* imageData = nullptr;\n\tULTMRZ_SDK_ASSERT((*result_ = UltMrzSdkEngine::process(\n\t\t\tULTMRZ_SDK_IMAGE_TYPE_RGB24,\n\t\t\timageData,\n\t\t\timageWidth,\n\t\t\timageHeight\n\t\t)).isOK());\n\n\t// DeInit\n\t// Call this function before exiting the app to free the allocate resources\n\t// You must not call process() after calling this function\n\tULTMRZ_SDK_ASSERT((result = UltMrzSdkEngine::deInit()).isOK());\n```\n\nAgain, please check the [sample applications](Sample-applications) for more information on how to use the API.\n\n\n\u003ca name=\"Technical-questions\"\u003e\u003c/a\u003e\n # Technical questions #\n Please check our [discussion group](https://groups.google.com/forum/#!forum/doubango-ai) or [twitter account](https://twitter.com/doubangotelecom?lang=en)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoubangotelecom%2Fultimatemrz-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoubangotelecom%2Fultimatemrz-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoubangotelecom%2Fultimatemrz-sdk/lists"}