├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ ├── feature_request.yml │ └── support_question.yml ├── dependabot.yml └── workflows │ └── deploy.yml ├── .gitignore ├── CONTRIBUTING.md ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── Makefile ├── README.md ├── Vagrantfile ├── config.rb ├── deploy.sh ├── font-selection.json ├── lib ├── monokai_sublime_slate.rb ├── multilang.rb ├── nesting_unique_head.rb ├── toc_data.rb └── unique_head.rb ├── slate.sh └── source ├── changelog └── index.html.md ├── deprecated └── index.html.md ├── fonts ├── IRANSansFaNum │ ├── eot │ │ ├── IRANSansWeb(FaNum).eot │ │ ├── IRANSansWeb(FaNum)_Black.eot │ │ ├── IRANSansWeb(FaNum)_Bold.eot │ │ ├── IRANSansWeb(FaNum)_Light.eot │ │ ├── IRANSansWeb(FaNum)_Medium.eot │ │ └── IRANSansWeb(FaNum)_UltraLight.eot │ ├── ttf │ │ ├── IRANSansWeb(FaNum).ttf │ │ ├── IRANSansWeb(FaNum)_Black.ttf │ │ ├── IRANSansWeb(FaNum)_Bold.ttf │ │ ├── IRANSansWeb(FaNum)_Light.ttf │ │ ├── IRANSansWeb(FaNum)_Medium.ttf │ │ └── IRANSansWeb(FaNum)_UltraLight.ttf │ ├── woff │ │ ├── IRANSansWeb(FaNum).woff │ │ ├── IRANSansWeb(FaNum)_Black.woff │ │ ├── IRANSansWeb(FaNum)_Bold.woff │ │ ├── IRANSansWeb(FaNum)_Light.woff │ │ ├── IRANSansWeb(FaNum)_Medium.woff │ │ └── IRANSansWeb(FaNum)_UltraLight.woff │ └── woff2 │ │ ├── IRANSansWeb(FaNum).woff2 │ │ ├── IRANSansWeb(FaNum)_Black.woff2 │ │ ├── IRANSansWeb(FaNum)_Bold.woff2 │ │ ├── IRANSansWeb(FaNum)_Light.woff2 │ │ ├── IRANSansWeb(FaNum)_Medium.woff2 │ │ └── IRANSansWeb(FaNum)_UltraLight.woff2 ├── Vazir │ ├── Vazir-Black-FD.eot │ ├── Vazir-Black-FD.ttf │ ├── Vazir-Black-FD.woff │ ├── Vazir-Black-FD.woff2 │ ├── Vazir-Bold-FD.eot │ ├── Vazir-Bold-FD.ttf │ ├── Vazir-Bold-FD.woff │ ├── Vazir-Bold-FD.woff2 │ ├── Vazir-Light-FD.eot │ ├── Vazir-Light-FD.ttf │ ├── Vazir-Light-FD.woff │ ├── Vazir-Light-FD.woff2 │ ├── Vazir-Medium-FD.eot │ ├── Vazir-Medium-FD.ttf │ ├── Vazir-Medium-FD.woff │ ├── Vazir-Medium-FD.woff2 │ ├── Vazir-Regular-FD.eot │ ├── Vazir-Regular-FD.ttf │ ├── Vazir-Regular-FD.woff │ ├── Vazir-Regular-FD.woff2 │ ├── Vazir-Thin-FD.eot │ ├── Vazir-Thin-FD.ttf │ ├── Vazir-Thin-FD.woff │ └── Vazir-Thin-FD.woff2 ├── slate.eot ├── slate.svg ├── slate.ttf ├── slate.woff └── slate.woff2 ├── images ├── active-convertor.jpg ├── active-gateway.jpg ├── active-plugin.jpg ├── converter-admin.jpg ├── favicon.ico ├── gateway-setting.jpg ├── logo.png ├── navbar.png ├── nobitex-dashboard.jpg └── plugin-upload.jpg ├── includes ├── _address_book.md ├── _auth.md ├── _faq.md ├── _general_notes.md ├── _intro.md ├── _market_data.md ├── _market_trade.md ├── _other.md ├── _portfolio.md ├── _position.md ├── _referral.md ├── _security.md ├── _symbols.md ├── _user_data.md ├── _websocket.md ├── _withdraw.md └── internal │ ├── _2fa.md │ ├── _active_order_count.md │ ├── _batch_actions.md │ ├── _gift.md │ ├── _notifications.md │ ├── _price_alerts.md │ ├── _ticketing.md │ ├── _transactions.md │ └── _wallet_invoice.md ├── index.html.md ├── internal.html.md ├── javascripts ├── all.js ├── all_nosearch.js ├── app │ ├── _copy.js │ ├── _lang.js │ ├── _search.js │ └── _toc.js └── lib │ ├── _energize.js │ ├── _imagesloaded.min.js │ ├── _jquery.highlight.js │ ├── _jquery.js │ └── _lunr.js ├── layouts └── layout.erb ├── postman ├── Nobitex Gateway Testnet.postman_collection.json └── Nobitex Gateway.postman_collection.json ├── stylesheets ├── _icon-font.scss ├── _normalize.scss ├── _rtl.scss ├── _variables.scss ├── custom.css.scss ├── print.css.scss └── screen.css.scss └── terms └── index.html.md /.dockerignore: -------------------------------------------------------------------------------- 1 | build/ 2 | .github/ 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # Top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | indent_style = space 11 | indent_size = 2 12 | trim_trailing_whitespace = true 13 | 14 | [*.rb] 15 | charset = utf-8 16 | 17 | [*.md] 18 | trim_trailing_whitespace = false 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | source/javascripts/lib/* linguist-vendored 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: گزارش خطا 2 | description: برای کمک به بهبود ما، مشاهدات خود را گزارش کنید 3 | title: "[خطا]: " 4 | labels: ["bug"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | **توجه:** قبل از ثبت مورد جدید، [مستندات عملکرد فعلی](https://apidocs.nobitex.ir/) و [موردهای قدیمی خطا](https://github.com/nobitex/docs-api/issues?q=is%3Aissue+label%3Abug) را بخوانید. در صورت یافتن مورد مشابه همانجا مسئله خود را مطرح کنید 10 | - type: textarea 11 | id: description 12 | attributes: 13 | label: شرح خطا 14 | description: | 15 | خطای مشاهده شده را به طور اجمالی شرح دهید: 16 | - type: textarea 17 | id: request 18 | attributes: 19 | label: جزئیات درخواست 20 | placeholder: | 21 | 1. آدرس: `POST /sample/url` 22 | 2. داده: 23 | - key1: value1 24 | - key2: value2 25 | - ... 26 | 3. هدر: 27 | - Authorization: yes 28 | - ... 29 | 4. محیط: 30 | - تست‌نت 31 | - اصلی 32 | value: | 33 | 1. آدرس: `POST /sample/url` 34 | 2. داده: 35 | - key1: value1 36 | - key2: value2 37 | - ... 38 | 3. هدر: 39 | - Authorization: yes 40 | - ... 41 | 4. محیط: 42 | - تست‌نت 43 | - اصلی 44 | validations: 45 | required: true 46 | - type: textarea 47 | id: current-response 48 | attributes: 49 | label: پاسخ دریافتی 50 | description: | 51 | پاسخ کامل نوبیتکس را در اینجا درج کنید. داده‌های حساس خود را در آن با * مخدوش نمایید: 52 | placeholder: | 53 | ```{"status": "ok", "result": {"id": 12***5,...}``` 54 | validations: 55 | required: true 56 | - type: textarea 57 | id: expected-response 58 | attributes: 59 | label: پاسخ مورد انتظار 60 | description: | 61 | شرح دقیقی از رفتار مورد انتظار خود از نوبیتکس بدهید: 62 | validations: 63 | required: true 64 | - type: textarea 65 | id: reference 66 | attributes: 67 | label: پیوند مراجع 68 | description: | 69 | در صورتی که رفتار نوبیتکس با توصیفات مستندات مغایرت دارد، لینک یا تصویر بخش مد نظر خود را ضمیمه کنید/ 70 | در صورتی که رفتار با منطق کاری صرافی‌ها تفاوت دارد، لینک مقاله تایید کننده پاسخ مورد انتظار را ضمیمه کنید: 71 | placeholder: | 72 | - https://apidocs.nobitex.ir/#example-section 73 | - https://www.investopedia.com/... 74 | - ... 75 | - type: textarea 76 | id: additional-data 77 | attributes: 78 | label: اطلاعات تکمیلی 79 | description: | 80 | هر اطلاعات دیگری که برای کشف ریشه خطا می‌تواند به ما کمک کند: 81 | placeholder: | 82 | - محل استفاده (محلی/VPS/...) 83 | - محل IP (داخلی/خارجی) 84 | - ... 85 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: درخواست فیچر 2 | description: امکانات مورد نیاز خود را به ما پیشنهاد دهید 3 | title: "[پیشنهاد]: " 4 | labels: ["enhancement"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | **توجه:** قبل از ثبت مورد جدید، [مستندات امکانات موجود](https://apidocs.nobitex.ir/) و [موردهای قدیمی فیچر](https://github.com/nobitex/docs-api/issues?q=is%3Aissue+label%3Aenhancement) را بخوانید. در صورت یافتن مورد مشابه همانجا مسئله خود را مطرح کنید 10 | - type: textarea 11 | id: requirement 12 | attributes: 13 | label: نیازمندی 14 | description: | 15 | چرا به این امکان نیازمند شده‌اید؟ مشکلی که با آن روبرو شده‌اید را دقیقا شرح دهید: 16 | validations: 17 | required: true 18 | - type: textarea 19 | id: solution 20 | attributes: 21 | label: راه‌حل 22 | description: | 23 | چه راه‌حلی برای رفع این نیاز می‌توانیم به شما ارائه کنیم؟ پیشنهاد(های) خود را شفاف و دقیق شرح دهید: 24 | validations: 25 | required: true 26 | - type: textarea 27 | id: similar-features 28 | attributes: 29 | label: امکانات مشابه 30 | description: | 31 | سایر صرافی‌های بزرگ چه امکانات مشابهی برای رفع این نیاز در نظر گرفته‌اند؟ با ضمیمه کردن پیوند به مستندات آنها ما را در تحلیل سریع‌تر درخواست‌های شما یاری کنید: 32 | - type: textarea 33 | id: additional-words 34 | attributes: 35 | label: توضیح تکمیلی 36 | description: | 37 | هر چیزی که از قلم مانده و به فهم بهتر ما کمک می‌کند در اینجا شرح دهید: 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/support_question.yml: -------------------------------------------------------------------------------- 1 | name: سوال پشتیبانی 2 | description: برای نحوه استفاده از ما کمک بخواهید 3 | title: "[پشتیبانی]: " 4 | labels: ["api-usage"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | **توجه:** قبل از ثبت مورد جدید [مستندات مربوطه](https://apidocs.nobitex.ir/) و [موردهای قدیمی پشتیبانی](https://github.com/nobitex/docs-api/issues?q=is%3Aissue+label%3Aapi-usage) را بخوانید. در صورت یافتن مورد مشابه همانجا مسئله خود را مطرح کنید 10 | - type: textarea 11 | id: goal 12 | attributes: 13 | label: هدف 14 | description: | 15 | به طور اجمالی شرح دهید می‌خواهید چه کاری از طریق نوبیتکس انجام دهید: 16 | placeholder: | 17 | مثلا: ثبت سفارش خرید دوج کوین به قیمت بازار 18 | validations: 19 | required: true 20 | - type: textarea 21 | id: environment 22 | attributes: 23 | label: محیط درخواست 24 | description: | 25 | ویژگی‌های موثر در درخواست را طبق مستندات آن ارائه کنید: 26 | placeholder: | 27 | - ابزار درخواست (مرورگر/ابزار/برنامه/...) 28 | - زبان برنامه (cURL/Python/PHP/...) 29 | - محل درخواست (local/VPS/...) 30 | - درخواست IP (داخلی/خارجی) 31 | - ... 32 | value: | 33 | - ابزار درخواست (مرورگر/ابزار/برنامه/...) 34 | - زبان برنامه (cURL/Python/PHP/...) 35 | - محل درخواست (local/VPS/...) 36 | - درخواست IP (داخلی/خارجی) 37 | - ... 38 | - type: textarea 39 | id: request 40 | attributes: 41 | label: نحوه درخواست 42 | description: | 43 | کد مورد استفاده خود را ضمیمه کنید: 44 | این بخش از کد باید شامل اطلاعات زیر باشد: 1. آدرس 2. داده 3. هدر 4. محیط (آدرس پایه) 45 | داده‌های حساس خود مانند توکن هویت یا شناسه سفارشات را با * مخدوش نمایید 46 | placeholder: | 47 | مثلا: 48 | ```python 49 | import requests 50 | url = 'https://api.nobitex.ir/market/orders/add' 51 | headers = {'Authorization': 'Token abt*********************xz'} 52 | data = {'srcCurrency': 'doge', 'type': 'buy', 'execution': 'market', ...} 53 | response = requests.post(url, json=data, headers=headers) 54 | print(response.json()) 55 | ``` 56 | validations: 57 | required: true 58 | - type: textarea 59 | id: response 60 | attributes: 61 | label: پاسخ دریافتی 62 | description: | 63 | پیغام خطای نوبیتکس را در اینجا درج کنید: 64 | placeholder: | 65 | ```{"status": "failed", "code": "SampleCode",...}``` 66 | validations: 67 | required: true 68 | - type: textarea 69 | id: additional-data 70 | attributes: 71 | label: اطلاعات تکمیلی 72 | description: | 73 | هر اطلاعات دیگری که برای کشف ریشه مشکل می‌تواند به ما کمک کند در اینجا ضمیمه کنید: 74 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: bundler 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 10 8 | target-branch: dev 9 | versioning-strategy: increase-if-necessary 10 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | branches: [ 'master' ] 6 | 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | env: 11 | ruby-version: 3.3.8 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Set up Ruby 16 | uses: ruby/setup-ruby@v1 17 | with: 18 | ruby-version: ${{ env.ruby-version }} 19 | 20 | 21 | - uses: actions/cache@v4 22 | with: 23 | path: vendor/bundle 24 | key: gems-${{ runner.os }}-${{ env.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} 25 | restore-keys: | 26 | gems-${{ runner.os }}-${{ env.ruby-version }}- 27 | gems-${{ runner.os }}- 28 | 29 | - run: bundle config set deployment 'true' 30 | - name: bundle install 31 | run: | 32 | bundle config path vendor/bundle 33 | bundle install --jobs 4 --retry 3 34 | 35 | - run: bundle exec middleman build 36 | 37 | - name: Deploy 38 | uses: peaceiris/actions-gh-pages@v3 39 | with: 40 | github_token: ${{ secrets.GITHUB_TOKEN }} 41 | publish_dir: ./build 42 | keep_files: true 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | .bundle 4 | .config 5 | coverage 6 | InstalledFiles 7 | vendor/bundle 8 | lib/bundler/man 9 | pkg 10 | rdoc 11 | spec/reports 12 | test/tmp 13 | test/version_tmp 14 | tmp 15 | *.DS_STORE 16 | build/ 17 | .cache 18 | .vagrant 19 | .sass-cache 20 | 21 | # YARD artifacts 22 | .yardoc 23 | _yardoc 24 | doc/ 25 | .idea/ 26 | .vscode 27 | 28 | # Vagrant artifacts 29 | ubuntu-*-console.log 30 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Development 4 | To install dependencies, after installing `ruby`, install bundle with `gem install bundler` and then 5 | use `bundle install` to install dependencies. 6 | 7 | Now you can start editing files in `source` directory. Launch a server with `make serve` to view the 8 | resulting HTML in your browser. 9 | 10 | To build the site run `make build`. This will generate site's static files in `build` folder. 11 | 12 | # References 13 | * https://github.com/lord/slate/wiki/ 14 | * https://developer.tradegecko.com/docs.html 15 | * https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ruby:2.6-slim 2 | 3 | WORKDIR /srv/slate 4 | 5 | VOLUME /srv/slate/build 6 | VOLUME /srv/slate/source 7 | 8 | EXPOSE 4567 9 | 10 | COPY Gemfile . 11 | COPY Gemfile.lock . 12 | 13 | RUN apt-get update \ 14 | && apt-get install -y --no-install-recommends \ 15 | build-essential \ 16 | git \ 17 | nodejs \ 18 | && gem install bundler \ 19 | && bundle install \ 20 | && apt-get remove -y build-essential git \ 21 | && apt-get autoremove -y \ 22 | && rm -rf /var/lib/apt/lists/* 23 | 24 | COPY . /srv/slate 25 | 26 | RUN chmod +x /srv/slate/slate.sh 27 | 28 | ENTRYPOINT ["/srv/slate/slate.sh"] 29 | CMD ["build"] 30 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | ruby '>= 2.5' 2 | source 'https://rubygems.org' 3 | 4 | 5 | gem "rack", ">= 2.2.13", "< 3.0" 6 | # Middleman 7 | gem 'middleman', '~> 4.4' 8 | gem 'middleman-syntax', '~> 3.2' 9 | gem 'middleman-autoprefixer', '~> 3.0' 10 | gem 'middleman-sprockets', '~> 4.1' 11 | gem 'rouge', '~> 3.21' 12 | gem 'redcarpet', '~> 3.5.0' 13 | gem "nokogiri", ">= 1.18.8" 14 | gem 'sass' 15 | gem 'webrick' 16 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (6.1.7.3) 5 | concurrent-ruby (~> 1.0, >= 1.0.2) 6 | i18n (>= 1.6, < 2) 7 | minitest (>= 5.1) 8 | tzinfo (~> 2.0) 9 | zeitwerk (~> 2.3) 10 | addressable (2.8.0) 11 | public_suffix (>= 2.0.2, < 5.0) 12 | autoprefixer-rails (10.2.5.0) 13 | execjs (< 2.8.0) 14 | backports (3.21.0) 15 | coffee-script (2.4.1) 16 | coffee-script-source 17 | execjs 18 | coffee-script-source (1.12.2) 19 | concurrent-ruby (1.2.2) 20 | contracts (0.13.0) 21 | dotenv (2.7.6) 22 | erubis (2.7.0) 23 | execjs (2.7.0) 24 | fast_blank (1.0.0) 25 | fastimage (2.2.4) 26 | ffi (1.15.0) 27 | haml (5.2.1) 28 | temple (>= 0.8.0) 29 | tilt 30 | hamster (3.0.0) 31 | concurrent-ruby (~> 1.0) 32 | hashie (3.6.0) 33 | i18n (1.6.0) 34 | concurrent-ruby (~> 1.0) 35 | kramdown (2.3.1) 36 | rexml 37 | listen (3.0.8) 38 | rb-fsevent (~> 0.9, >= 0.9.4) 39 | rb-inotify (~> 0.9, >= 0.9.7) 40 | memoist (0.16.2) 41 | middleman (4.4.0) 42 | coffee-script (~> 2.2) 43 | haml (>= 4.0.5) 44 | kramdown (>= 2.3.0) 45 | middleman-cli (= 4.4.0) 46 | middleman-core (= 4.4.0) 47 | middleman-autoprefixer (3.0.0) 48 | autoprefixer-rails (~> 10.0) 49 | middleman-core (>= 4.0.0) 50 | middleman-cli (4.4.0) 51 | thor (>= 0.17.0, < 2.0) 52 | middleman-core (4.4.0) 53 | activesupport (>= 6.1, < 7.0) 54 | addressable (~> 2.4) 55 | backports (~> 3.6) 56 | bundler (~> 2.0) 57 | contracts (~> 0.13.0) 58 | dotenv 59 | erubis 60 | execjs (~> 2.0) 61 | fast_blank 62 | fastimage (~> 2.0) 63 | hamster (~> 3.0) 64 | hashie (~> 3.4) 65 | i18n (~> 1.6.0) 66 | listen (~> 3.0.0) 67 | memoist (~> 0.14) 68 | padrino-helpers (~> 0.15.0) 69 | parallel 70 | rack (>= 1.4.5, < 3) 71 | sassc (~> 2.0) 72 | servolux 73 | tilt (~> 2.0.9) 74 | toml 75 | uglifier (~> 3.0) 76 | webrick 77 | middleman-sprockets (4.1.1) 78 | middleman-core (~> 4.0) 79 | sprockets (>= 3.0) 80 | middleman-syntax (3.2.0) 81 | middleman-core (>= 3.2) 82 | rouge (~> 3.2) 83 | mini_portile2 (2.8.7) 84 | minitest (5.18.0) 85 | nokogiri (1.18.8) 86 | mini_portile2 (~> 2.8.2) 87 | racc (~> 1.4) 88 | padrino-helpers (0.15.1) 89 | i18n (>= 0.6.7, < 2) 90 | padrino-support (= 0.15.1) 91 | tilt (>= 1.4.1, < 3) 92 | padrino-support (0.15.1) 93 | parallel (1.20.1) 94 | parslet (2.0.0) 95 | public_suffix (4.0.6) 96 | racc (1.8.1) 97 | rack (2.2.13) 98 | rb-fsevent (0.11.0) 99 | rb-inotify (0.10.1) 100 | ffi (~> 1.0) 101 | redcarpet (3.5.1) 102 | rexml (3.3.6) 103 | strscan 104 | rouge (3.26.0) 105 | sass (3.7.4) 106 | sass-listen (~> 4.0.0) 107 | sass-listen (4.0.0) 108 | rb-fsevent (~> 0.9, >= 0.9.4) 109 | rb-inotify (~> 0.9, >= 0.9.7) 110 | sassc (2.4.0) 111 | ffi (~> 1.9) 112 | servolux (0.13.0) 113 | sprockets (3.7.2) 114 | concurrent-ruby (~> 1.0) 115 | rack (> 1, < 3) 116 | strscan (3.1.0) 117 | temple (0.8.2) 118 | thor (1.1.0) 119 | tilt (2.0.10) 120 | toml (0.3.0) 121 | parslet (>= 1.8.0, < 3.0.0) 122 | tzinfo (2.0.6) 123 | concurrent-ruby (~> 1.0) 124 | uglifier (3.2.0) 125 | execjs (>= 0.3.0, < 3) 126 | webrick (1.8.2) 127 | zeitwerk (2.6.7) 128 | 129 | PLATFORMS 130 | ruby 131 | 132 | DEPENDENCIES 133 | middleman (~> 4.4) 134 | middleman-autoprefixer (~> 3.0) 135 | middleman-sprockets (~> 4.1) 136 | middleman-syntax (~> 3.2) 137 | nokogiri (>= 1.18.8) 138 | rack (>= 2.2.13, < 3.0) 139 | redcarpet (~> 3.5.0) 140 | rouge (~> 3.21) 141 | sass 142 | webrick 143 | 144 | RUBY VERSION 145 | ruby 3.1.0 146 | 147 | BUNDLED WITH 148 | 2.6.8 149 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: clean build serve 2 | 3 | all: build 4 | 5 | build: 6 | bundle exec middleman build 7 | 8 | serve: 9 | bundle exec middleman server 10 | 11 | clean: 12 | rm -rf build 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nobitex API Documentation 2 | [![Visit Documentation Website](https://img.shields.io/badge/visit-Documentation_Website-blueviolet)](https://apidocs.nobitex.ir) 3 | [![Deploy](https://github.com/nobitex/docs-api/actions/workflows/deploy.yml/badge.svg)](https://github.com/nobitex/docs-api/actions/workflows/deploy.yml) 4 | 5 | This repository contains documentation for connecting to the Nobitex cryptocurrency exchange market and using the 6 | official APIs. Feel free to create new issues for reporting documentation ambiguities and suggesting 7 | improvements to documentation or the underlying API. 8 | 9 | Built API documentation is available on [https://apidocs.nobitex.ir/](https://apidocs.nobitex.ir). 10 | The documentation is generated using [Slate](https://github.com/lord/slate). 11 | If you want to contribute to the documentation itself, see [Contributing](https://github.com/nobitex/docs-api/blob/master/CONTRIBUTING.md). 12 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | Vagrant.configure(2) do |config| 2 | config.vm.box = "ubuntu/bionic64" 3 | config.vm.network :forwarded_port, guest: 4567, host: 4567 4 | config.vm.provider "virtualbox" do |vb| 5 | vb.memory = "2048" 6 | end 7 | 8 | config.vm.provision "bootstrap", 9 | type: "shell", 10 | inline: <<-SHELL 11 | # add nodejs v12 repository 12 | curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - 13 | 14 | sudo apt-get update 15 | sudo apt-get install -yq ruby ruby-dev 16 | sudo apt-get install -yq pkg-config build-essential nodejs git libxml2-dev libxslt-dev 17 | sudo apt-get autoremove -yq 18 | gem install --no-ri --no-rdoc bundler 19 | SHELL 20 | 21 | # add the local user git config to the vm 22 | config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig" 23 | 24 | config.vm.provision "install", 25 | type: "shell", 26 | privileged: false, 27 | inline: <<-SHELL 28 | echo "==============================================" 29 | echo "Installing app dependencies" 30 | cd /vagrant 31 | sudo gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)" 32 | bundle config build.nokogiri --use-system-libraries 33 | bundle install 34 | SHELL 35 | 36 | config.vm.provision "run", 37 | type: "shell", 38 | privileged: false, 39 | run: "always", 40 | inline: <<-SHELL 41 | echo "==============================================" 42 | echo "Starting up middleman at http://localhost:4567" 43 | echo "If it does not come up, check the ~/middleman.log file for any error messages" 44 | cd /vagrant 45 | bundle exec middleman server --watcher-force-polling --watcher-latency=1 &> ~/middleman.log & 46 | SHELL 47 | end 48 | -------------------------------------------------------------------------------- /config.rb: -------------------------------------------------------------------------------- 1 | # Unique header generation 2 | require './lib/unique_head.rb' 3 | 4 | # Markdown 5 | set :markdown_engine, :redcarpet 6 | set :markdown, 7 | fenced_code_blocks: true, 8 | smartypants: true, 9 | disable_indented_code_blocks: true, 10 | prettify: true, 11 | strikethrough: true, 12 | tables: true, 13 | with_toc_data: true, 14 | no_intra_emphasis: true, 15 | renderer: UniqueHeadCounter 16 | 17 | # Assets 18 | set :css_dir, 'stylesheets' 19 | set :js_dir, 'javascripts' 20 | set :images_dir, 'images' 21 | set :fonts_dir, 'fonts' 22 | 23 | # Activate the syntax highlighter 24 | activate :syntax 25 | ready do 26 | require './lib/monokai_sublime_slate.rb' 27 | require './lib/multilang.rb' 28 | end 29 | 30 | activate :sprockets 31 | 32 | activate :autoprefixer do |config| 33 | config.browsers = ['last 2 version', 'Firefox ESR'] 34 | config.cascade = false 35 | config.inline = true 36 | end 37 | 38 | # Github pages require relative links 39 | activate :relative_assets 40 | set :relative_links, true 41 | 42 | # Build Configuration 43 | configure :build do 44 | # We do want to hash woff and woff2 as there's a bug where woff2 will use 45 | # woff asset hash which breaks things. Trying to use a combination of ignore and 46 | # rewrite_ignore does not work as it conflicts weirdly with relative_assets. Disabling 47 | # the .woff2 extension only does not work as .woff will still activate it so have to 48 | # have both. See https://github.com/slatedocs/slate/issues/1171 for more details. 49 | activate :asset_hash, :exts => app.config[:asset_extensions] - %w[.woff .woff2] 50 | # If you're having trouble with Middleman hanging, commenting 51 | # out the following two lines has been known to help 52 | activate :minify_css 53 | activate :minify_javascript 54 | # activate :gzip 55 | end 56 | 57 | # Deploy Configuration 58 | # If you want Middleman to listen on a different port, you can set that below 59 | set :port, 4567 60 | 61 | helpers do 62 | require './lib/toc_data.rb' 63 | end 64 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -o errexit #abort if any command fails 3 | me=$(basename "$0") 4 | 5 | help_message="\ 6 | Usage: $me [-c FILE] [] 7 | Deploy generated files to a git branch. 8 | 9 | Options: 10 | 11 | -h, --help Show this help information. 12 | -v, --verbose Increase verbosity. Useful for debugging. 13 | -e, --allow-empty Allow deployment of an empty directory. 14 | -m, --message MESSAGE Specify the message used when committing on the 15 | deploy branch. 16 | -n, --no-hash Don't append the source commit's hash to the deploy 17 | commit's message. 18 | --source-only Only build but not push 19 | --push-only Only push but not build 20 | " 21 | 22 | 23 | run_build() { 24 | bundle exec middleman build --clean 25 | } 26 | 27 | parse_args() { 28 | # Set args from a local environment file. 29 | if [ -e ".env" ]; then 30 | source .env 31 | fi 32 | 33 | # Parse arg flags 34 | # If something is exposed as an environment variable, set/overwrite it 35 | # here. Otherwise, set/overwrite the internal variable instead. 36 | while : ; do 37 | if [[ $1 = "-h" || $1 = "--help" ]]; then 38 | echo "$help_message" 39 | exit 0 40 | elif [[ $1 = "-v" || $1 = "--verbose" ]]; then 41 | verbose=true 42 | shift 43 | elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then 44 | allow_empty=true 45 | shift 46 | elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then 47 | commit_message=$2 48 | shift 2 49 | elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then 50 | GIT_DEPLOY_APPEND_HASH=false 51 | shift 52 | elif [[ $1 = "--source-only" ]]; then 53 | source_only=true 54 | shift 55 | elif [[ $1 = "--push-only" ]]; then 56 | push_only=true 57 | shift 58 | else 59 | break 60 | fi 61 | done 62 | 63 | if [ ${source_only} ] && [ ${push_only} ]; then 64 | >&2 echo "You can only specify one of --source-only or --push-only" 65 | exit 1 66 | fi 67 | 68 | # Set internal option vars from the environment and arg flags. All internal 69 | # vars should be declared here, with sane defaults if applicable. 70 | 71 | # Source directory & target branch. 72 | deploy_directory=build 73 | deploy_branch=gh-pages 74 | 75 | #if no user identity is already set in the current git environment, use this: 76 | default_username=${GIT_DEPLOY_USERNAME:-deploy.sh} 77 | default_email=${GIT_DEPLOY_EMAIL:-} 78 | 79 | #repository to deploy to. must be readable and writable. 80 | repo=origin 81 | 82 | #append commit hash to the end of message by default 83 | append_hash=${GIT_DEPLOY_APPEND_HASH:-true} 84 | } 85 | 86 | main() { 87 | enable_expanded_output 88 | 89 | if ! git diff --exit-code --quiet --cached; then 90 | echo Aborting due to uncommitted changes in the index >&2 91 | return 1 92 | fi 93 | 94 | commit_title=`git log -n 1 --format="%s" HEAD` 95 | commit_hash=` git log -n 1 --format="%H" HEAD` 96 | 97 | #default commit message uses last title if a custom one is not supplied 98 | if [[ -z $commit_message ]]; then 99 | commit_message="publish: $commit_title" 100 | fi 101 | 102 | #append hash to commit message unless no hash flag was found 103 | if [ $append_hash = true ]; then 104 | commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash" 105 | fi 106 | 107 | previous_branch=`git rev-parse --abbrev-ref HEAD` 108 | 109 | if [ ! -d "$deploy_directory" ]; then 110 | echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2 111 | return 1 112 | fi 113 | 114 | # must use short form of flag in ls for compatibility with macOS and BSD 115 | if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then 116 | echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2 117 | return 1 118 | fi 119 | 120 | if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then 121 | # deploy_branch exists in $repo; make sure we have the latest version 122 | 123 | disable_expanded_output 124 | git fetch --force $repo $deploy_branch:$deploy_branch 125 | enable_expanded_output 126 | fi 127 | 128 | # check if deploy_branch exists locally 129 | if git show-ref --verify --quiet "refs/heads/$deploy_branch" 130 | then incremental_deploy 131 | else initial_deploy 132 | fi 133 | 134 | restore_head 135 | } 136 | 137 | initial_deploy() { 138 | git --work-tree "$deploy_directory" checkout --orphan $deploy_branch 139 | git --work-tree "$deploy_directory" add --all 140 | commit+push 141 | } 142 | 143 | incremental_deploy() { 144 | #make deploy_branch the current branch 145 | git symbolic-ref HEAD refs/heads/$deploy_branch 146 | #put the previously committed contents of deploy_branch into the index 147 | git --work-tree "$deploy_directory" reset --mixed --quiet 148 | git --work-tree "$deploy_directory" add --all 149 | 150 | set +o errexit 151 | diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$? 152 | set -o errexit 153 | case $diff in 154 | 0) echo No changes to files in $deploy_directory. Skipping commit.;; 155 | 1) commit+push;; 156 | *) 157 | echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2 158 | return $diff 159 | ;; 160 | esac 161 | } 162 | 163 | commit+push() { 164 | set_user_id 165 | git --work-tree "$deploy_directory" commit -m "$commit_message" 166 | 167 | disable_expanded_output 168 | #--quiet is important here to avoid outputting the repo URL, which may contain a secret token 169 | git push --quiet $repo $deploy_branch 170 | enable_expanded_output 171 | } 172 | 173 | #echo expanded commands as they are executed (for debugging) 174 | enable_expanded_output() { 175 | if [ $verbose ]; then 176 | set -o xtrace 177 | set +o verbose 178 | fi 179 | } 180 | 181 | #this is used to avoid outputting the repo URL, which may contain a secret token 182 | disable_expanded_output() { 183 | if [ $verbose ]; then 184 | set +o xtrace 185 | set -o verbose 186 | fi 187 | } 188 | 189 | set_user_id() { 190 | if [[ -z `git config user.name` ]]; then 191 | git config user.name "$default_username" 192 | fi 193 | if [[ -z `git config user.email` ]]; then 194 | git config user.email "$default_email" 195 | fi 196 | } 197 | 198 | restore_head() { 199 | if [[ $previous_branch = "HEAD" ]]; then 200 | #we weren't on any branch before, so just set HEAD back to the commit it was on 201 | git update-ref --no-deref HEAD $commit_hash $deploy_branch 202 | else 203 | git symbolic-ref HEAD refs/heads/$previous_branch 204 | fi 205 | 206 | git reset --mixed 207 | } 208 | 209 | filter() { 210 | sed -e "s|$repo|\$repo|g" 211 | } 212 | 213 | sanitize() { 214 | "$@" 2> >(filter 1>&2) | filter 215 | } 216 | 217 | parse_args "$@" 218 | 219 | if [[ ${source_only} ]]; then 220 | run_build 221 | elif [[ ${push_only} ]]; then 222 | main "$@" 223 | else 224 | run_build 225 | main "$@" 226 | fi 227 | -------------------------------------------------------------------------------- /font-selection.json: -------------------------------------------------------------------------------- 1 | { 2 | "IcoMoonType": "selection", 3 | "icons": [ 4 | { 5 | "icon": { 6 | "paths": [ 7 | "M438.857 73.143q119.429 0 220.286 58.857t159.714 159.714 58.857 220.286-58.857 220.286-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857zM512 785.714v-108.571q0-8-5.143-13.429t-12.571-5.429h-109.714q-7.429 0-13.143 5.714t-5.714 13.143v108.571q0 7.429 5.714 13.143t13.143 5.714h109.714q7.429 0 12.571-5.429t5.143-13.429zM510.857 589.143l10.286-354.857q0-6.857-5.714-10.286-5.714-4.571-13.714-4.571h-125.714q-8 0-13.714 4.571-5.714 3.429-5.714 10.286l9.714 354.857q0 5.714 5.714 10t13.714 4.286h105.714q8 0 13.429-4.286t6-10z" 8 | ], 9 | "attrs": [], 10 | "isMulticolor": false, 11 | "tags": [ 12 | "exclamation-circle" 13 | ], 14 | "defaultCode": 61546, 15 | "grid": 14 16 | }, 17 | "attrs": [], 18 | "properties": { 19 | "id": 100, 20 | "order": 4, 21 | "prevSize": 28, 22 | "code": 58880, 23 | "name": "exclamation-sign", 24 | "ligatures": "" 25 | }, 26 | "setIdx": 0, 27 | "iconIdx": 0 28 | }, 29 | { 30 | "icon": { 31 | "paths": [ 32 | "M585.143 786.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-54.857v-292.571q0-8-5.143-13.143t-13.143-5.143h-182.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h54.857v182.857h-54.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h256q8 0 13.143-5.143t5.143-13.143zM512 274.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-109.714q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h109.714q8 0 13.143-5.143t5.143-13.143zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z" 33 | ], 34 | "attrs": [], 35 | "isMulticolor": false, 36 | "tags": [ 37 | "info-circle" 38 | ], 39 | "defaultCode": 61530, 40 | "grid": 14 41 | }, 42 | "attrs": [], 43 | "properties": { 44 | "id": 85, 45 | "order": 3, 46 | "name": "info-sign", 47 | "prevSize": 28, 48 | "code": 58882 49 | }, 50 | "setIdx": 0, 51 | "iconIdx": 2 52 | }, 53 | { 54 | "icon": { 55 | "paths": [ 56 | "M733.714 419.429q0-16-10.286-26.286l-52-51.429q-10.857-10.857-25.714-10.857t-25.714 10.857l-233.143 232.571-129.143-129.143q-10.857-10.857-25.714-10.857t-25.714 10.857l-52 51.429q-10.286 10.286-10.286 26.286 0 15.429 10.286 25.714l206.857 206.857q10.857 10.857 25.714 10.857 15.429 0 26.286-10.857l310.286-310.286q10.286-10.286 10.286-25.714zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z" 57 | ], 58 | "attrs": [], 59 | "isMulticolor": false, 60 | "tags": [ 61 | "check-circle" 62 | ], 63 | "defaultCode": 61528, 64 | "grid": 14 65 | }, 66 | "attrs": [], 67 | "properties": { 68 | "id": 83, 69 | "order": 9, 70 | "prevSize": 28, 71 | "code": 58886, 72 | "name": "ok-sign" 73 | }, 74 | "setIdx": 0, 75 | "iconIdx": 6 76 | }, 77 | { 78 | "icon": { 79 | "paths": [ 80 | "M658.286 475.429q0-105.714-75.143-180.857t-180.857-75.143-180.857 75.143-75.143 180.857 75.143 180.857 180.857 75.143 180.857-75.143 75.143-180.857zM950.857 950.857q0 29.714-21.714 51.429t-51.429 21.714q-30.857 0-51.429-21.714l-196-195.429q-102.286 70.857-228 70.857-81.714 0-156.286-31.714t-128.571-85.714-85.714-128.571-31.714-156.286 31.714-156.286 85.714-128.571 128.571-85.714 156.286-31.714 156.286 31.714 128.571 85.714 85.714 128.571 31.714 156.286q0 125.714-70.857 228l196 196q21.143 21.143 21.143 51.429z" 81 | ], 82 | "width": 951, 83 | "attrs": [], 84 | "isMulticolor": false, 85 | "tags": [ 86 | "search" 87 | ], 88 | "defaultCode": 61442, 89 | "grid": 14 90 | }, 91 | "attrs": [], 92 | "properties": { 93 | "id": 2, 94 | "order": 1, 95 | "prevSize": 28, 96 | "code": 58887, 97 | "name": "icon-search" 98 | }, 99 | "setIdx": 0, 100 | "iconIdx": 7 101 | } 102 | ], 103 | "height": 1024, 104 | "metadata": { 105 | "name": "slate", 106 | "license": "SIL OFL 1.1" 107 | }, 108 | "preferences": { 109 | "showGlyphs": true, 110 | "showQuickUse": true, 111 | "showQuickUse2": true, 112 | "showSVGs": true, 113 | "fontPref": { 114 | "prefix": "icon-", 115 | "metadata": { 116 | "fontFamily": "slate", 117 | "majorVersion": 1, 118 | "minorVersion": 0, 119 | "description": "Based on FontAwesome", 120 | "license": "SIL OFL 1.1" 121 | }, 122 | "metrics": { 123 | "emSize": 1024, 124 | "baseline": 6.25, 125 | "whitespace": 50 126 | }, 127 | "resetPoint": 58880, 128 | "showSelector": false, 129 | "selector": "class", 130 | "classSelector": ".icon", 131 | "showMetrics": false, 132 | "showMetadata": true, 133 | "showVersion": true, 134 | "ie7": false 135 | }, 136 | "imagePref": { 137 | "prefix": "icon-", 138 | "png": true, 139 | "useClassSelector": true, 140 | "color": 4473924, 141 | "bgColor": 16777215 142 | }, 143 | "historySize": 100, 144 | "showCodes": true, 145 | "gridSize": 16, 146 | "showLiga": false 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /lib/monokai_sublime_slate.rb: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- # 2 | # frozen_string_literal: true 3 | 4 | # this is based on https://github.com/rouge-ruby/rouge/blob/master/lib/rouge/themes/monokai_sublime.rb 5 | # but without the added background, and changed styling for JSON keys to be soft_yellow instead of white 6 | 7 | module Rouge 8 | module Themes 9 | class MonokaiSublimeSlate < CSSTheme 10 | name 'monokai.sublime.slate' 11 | 12 | palette :black => '#000000' 13 | palette :bright_green => '#a6e22e' 14 | palette :bright_pink => '#f92672' 15 | palette :carmine => '#960050' 16 | palette :dark => '#49483e' 17 | palette :dark_grey => '#888888' 18 | palette :dark_red => '#aa0000' 19 | palette :dimgrey => '#75715e' 20 | palette :emperor => '#555555' 21 | palette :grey => '#999999' 22 | palette :light_grey => '#aaaaaa' 23 | palette :light_violet => '#ae81ff' 24 | palette :soft_cyan => '#66d9ef' 25 | palette :soft_yellow => '#e6db74' 26 | palette :very_dark => '#1e0010' 27 | palette :whitish => '#f8f8f2' 28 | palette :orange => '#f6aa11' 29 | palette :white => '#ffffff' 30 | 31 | style Generic::Heading, :fg => :grey 32 | style Literal::String::Regex, :fg => :orange 33 | style Generic::Output, :fg => :dark_grey 34 | style Generic::Prompt, :fg => :emperor 35 | style Generic::Strong, :bold => false 36 | style Generic::Subheading, :fg => :light_grey 37 | style Name::Builtin, :fg => :orange 38 | style Comment::Multiline, 39 | Comment::Preproc, 40 | Comment::Single, 41 | Comment::Special, 42 | Comment, :fg => :dimgrey 43 | style Error, 44 | Generic::Error, 45 | Generic::Traceback, :fg => :carmine 46 | style Generic::Deleted, 47 | Generic::Inserted, 48 | Generic::Emph, :fg => :dark 49 | style Keyword::Constant, 50 | Keyword::Declaration, 51 | Keyword::Reserved, 52 | Name::Constant, 53 | Keyword::Type, :fg => :soft_cyan 54 | style Literal::Number::Float, 55 | Literal::Number::Hex, 56 | Literal::Number::Integer::Long, 57 | Literal::Number::Integer, 58 | Literal::Number::Oct, 59 | Literal::Number, 60 | Literal::String::Char, 61 | Literal::String::Escape, 62 | Literal::String::Symbol, :fg => :light_violet 63 | style Literal::String::Doc, 64 | Literal::String::Double, 65 | Literal::String::Backtick, 66 | Literal::String::Heredoc, 67 | Literal::String::Interpol, 68 | Literal::String::Other, 69 | Literal::String::Single, 70 | Literal::String, :fg => :soft_yellow 71 | style Name::Attribute, 72 | Name::Class, 73 | Name::Decorator, 74 | Name::Exception, 75 | Name::Function, :fg => :bright_green 76 | style Name::Variable::Class, 77 | Name::Namespace, 78 | Name::Entity, 79 | Name::Builtin::Pseudo, 80 | Name::Variable::Global, 81 | Name::Variable::Instance, 82 | Name::Variable, 83 | Text::Whitespace, 84 | Text, 85 | Name, :fg => :white 86 | style Name::Label, :fg => :bright_pink 87 | style Operator::Word, 88 | Name::Tag, 89 | Keyword, 90 | Keyword::Namespace, 91 | Keyword::Pseudo, 92 | Operator, :fg => :bright_pink 93 | end 94 | end 95 | end 96 | -------------------------------------------------------------------------------- /lib/multilang.rb: -------------------------------------------------------------------------------- 1 | module Multilang 2 | def block_code(code, full_lang_name) 3 | if full_lang_name 4 | parts = full_lang_name.split('--') 5 | rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified 6 | super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match| 7 | match + " tab-" + full_lang_name 8 | end 9 | else 10 | super(code, full_lang_name) 11 | end 12 | end 13 | end 14 | 15 | require 'middleman-core/renderers/redcarpet' 16 | Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang 17 | -------------------------------------------------------------------------------- /lib/nesting_unique_head.rb: -------------------------------------------------------------------------------- 1 | # Nested unique header generation 2 | require 'middleman-core/renderers/redcarpet' 3 | 4 | class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML 5 | def initialize 6 | super 7 | @@headers_history = {} if !defined?(@@headers_history) 8 | end 9 | 10 | def header(text, header_level) 11 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize 12 | @@headers_history[header_level] = text.parameterize 13 | 14 | if header_level > 1 15 | for i in (header_level - 1).downto(1) 16 | friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i) 17 | end 18 | end 19 | 20 | return "#{text}" 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /lib/toc_data.rb: -------------------------------------------------------------------------------- 1 | require 'nokogiri' 2 | 3 | def toc_data(page_content) 4 | html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content) 5 | 6 | # get a flat list of headers 7 | headers = [] 8 | html_doc.css('h1, h2, h3').each do |header| 9 | headers.push({ 10 | id: header.attribute('id').to_s, 11 | content: header.children, 12 | title: header.children.to_s.gsub(/<[^>]*>/, ''), 13 | level: header.name[1].to_i, 14 | children: [] 15 | }) 16 | end 17 | 18 | [3,2].each do |header_level| 19 | header_to_nest = nil 20 | headers = headers.reject do |header| 21 | if header[:level] == header_level 22 | header_to_nest[:children].push header if header_to_nest 23 | true 24 | else 25 | header_to_nest = header if header[:level] < header_level 26 | false 27 | end 28 | end 29 | end 30 | headers 31 | end 32 | -------------------------------------------------------------------------------- /lib/unique_head.rb: -------------------------------------------------------------------------------- 1 | # Unique header generation 2 | require 'middleman-core/renderers/redcarpet' 3 | require 'digest' 4 | class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML 5 | def initialize 6 | super 7 | @head_count = {} 8 | end 9 | def header(text, header_level) 10 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize 11 | if friendly_text.strip.length == 0 12 | # Looks like parameterize removed the whole thing! It removes many unicode 13 | # characters like Chinese and Russian. To get a unique URL, let's just 14 | # URI escape the whole header 15 | friendly_text = Digest::SHA1.hexdigest(text)[0,10] 16 | end 17 | @head_count[friendly_text] ||= 0 18 | @head_count[friendly_text] += 1 19 | if @head_count[friendly_text] > 1 20 | friendly_text += "-#{@head_count[friendly_text]}" 21 | end 22 | return "#{text}" 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /slate.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -o errexit #abort if any command fails 3 | 4 | me=$(basename "$0") 5 | 6 | help_message="\ 7 | Usage: $me [] [] 8 | Run commands related to the slate process. 9 | 10 | Commands: 11 | 12 | serve Run the middleman server process, useful for 13 | development. 14 | build Run the build process. 15 | deploy Will build and deploy files to branch. Use 16 | --no-build to only deploy. 17 | 18 | Global Options: 19 | 20 | -h, --help Show this help information. 21 | -v, --verbose Increase verbosity. Useful for debugging. 22 | 23 | Deploy options: 24 | -e, --allow-empty Allow deployment of an empty directory. 25 | -m, --message MESSAGE Specify the message used when committing on the 26 | deploy branch. 27 | -n, --no-hash Don't append the source commit's hash to the deploy 28 | commit's message. 29 | --no-build Do not build the source files. 30 | " 31 | 32 | 33 | run_serve() { 34 | exec bundle exec middleman serve --watcher-force-polling 35 | } 36 | 37 | run_build() { 38 | bundle exec middleman build --clean 39 | } 40 | 41 | parse_args() { 42 | # Set args from a local environment file. 43 | if [ -e ".env" ]; then 44 | source .env 45 | fi 46 | 47 | command= 48 | 49 | # Parse arg flags 50 | # If something is exposed as an environment variable, set/overwrite it 51 | # here. Otherwise, set/overwrite the internal variable instead. 52 | while : ; do 53 | if [[ $1 = "-h" || $1 = "--help" ]]; then 54 | echo "$help_message" 55 | exit 0 56 | elif [[ $1 = "-v" || $1 = "--verbose" ]]; then 57 | verbose=true 58 | shift 59 | elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then 60 | allow_empty=true 61 | shift 62 | elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then 63 | commit_message=$2 64 | shift 2 65 | elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then 66 | GIT_DEPLOY_APPEND_HASH=false 67 | shift 68 | elif [[ $1 = "--no-build" ]]; then 69 | no_build=true 70 | shift 71 | elif [[ $1 = "serve" || $1 = "build" || $1 = "deploy" ]]; then 72 | if [ ! -z "${command}" ]; then 73 | >&2 echo "You can only specify one command." 74 | exit 1 75 | fi 76 | command=$1 77 | shift 78 | elif [ -z $1 ]; then 79 | break 80 | fi 81 | done 82 | 83 | if [ -z "${command}" ]; then 84 | >&2 echo "Command not specified." 85 | exit 1 86 | fi 87 | 88 | # Set internal option vars from the environment and arg flags. All internal 89 | # vars should be declared here, with sane defaults if applicable. 90 | 91 | # Source directory & target branch. 92 | deploy_directory=build 93 | deploy_branch=gh-pages 94 | 95 | #if no user identity is already set in the current git environment, use this: 96 | default_username=${GIT_DEPLOY_USERNAME:-deploy.sh} 97 | default_email=${GIT_DEPLOY_EMAIL:-} 98 | 99 | #repository to deploy to. must be readable and writable. 100 | repo=origin 101 | 102 | #append commit hash to the end of message by default 103 | append_hash=${GIT_DEPLOY_APPEND_HASH:-true} 104 | } 105 | 106 | main() { 107 | enable_expanded_output 108 | 109 | if ! git diff --exit-code --quiet --cached; then 110 | echo Aborting due to uncommitted changes in the index >&2 111 | return 1 112 | fi 113 | 114 | commit_title=`git log -n 1 --format="%s" HEAD` 115 | commit_hash=` git log -n 1 --format="%H" HEAD` 116 | 117 | #default commit message uses last title if a custom one is not supplied 118 | if [[ -z $commit_message ]]; then 119 | commit_message="publish: $commit_title" 120 | fi 121 | 122 | #append hash to commit message unless no hash flag was found 123 | if [ $append_hash = true ]; then 124 | commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash" 125 | fi 126 | 127 | previous_branch=`git rev-parse --abbrev-ref HEAD` 128 | 129 | if [ ! -d "$deploy_directory" ]; then 130 | echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2 131 | return 1 132 | fi 133 | 134 | # must use short form of flag in ls for compatibility with macOS and BSD 135 | if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then 136 | echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2 137 | return 1 138 | fi 139 | 140 | if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then 141 | # deploy_branch exists in $repo; make sure we have the latest version 142 | 143 | disable_expanded_output 144 | git fetch --force $repo $deploy_branch:$deploy_branch 145 | enable_expanded_output 146 | fi 147 | 148 | # check if deploy_branch exists locally 149 | if git show-ref --verify --quiet "refs/heads/$deploy_branch" 150 | then incremental_deploy 151 | else initial_deploy 152 | fi 153 | 154 | restore_head 155 | } 156 | 157 | initial_deploy() { 158 | git --work-tree "$deploy_directory" checkout --orphan $deploy_branch 159 | git --work-tree "$deploy_directory" add --all 160 | commit+push 161 | } 162 | 163 | incremental_deploy() { 164 | #make deploy_branch the current branch 165 | git symbolic-ref HEAD refs/heads/$deploy_branch 166 | #put the previously committed contents of deploy_branch into the index 167 | git --work-tree "$deploy_directory" reset --mixed --quiet 168 | git --work-tree "$deploy_directory" add --all 169 | 170 | set +o errexit 171 | diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$? 172 | set -o errexit 173 | case $diff in 174 | 0) echo No changes to files in $deploy_directory. Skipping commit.;; 175 | 1) commit+push;; 176 | *) 177 | echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2 178 | return $diff 179 | ;; 180 | esac 181 | } 182 | 183 | commit+push() { 184 | set_user_id 185 | git --work-tree "$deploy_directory" commit -m "$commit_message" 186 | 187 | disable_expanded_output 188 | #--quiet is important here to avoid outputting the repo URL, which may contain a secret token 189 | git push --quiet $repo $deploy_branch 190 | enable_expanded_output 191 | } 192 | 193 | #echo expanded commands as they are executed (for debugging) 194 | enable_expanded_output() { 195 | if [ $verbose ]; then 196 | set -o xtrace 197 | set +o verbose 198 | fi 199 | } 200 | 201 | #this is used to avoid outputting the repo URL, which may contain a secret token 202 | disable_expanded_output() { 203 | if [ $verbose ]; then 204 | set +o xtrace 205 | set -o verbose 206 | fi 207 | } 208 | 209 | set_user_id() { 210 | if [[ -z `git config user.name` ]]; then 211 | git config user.name "$default_username" 212 | fi 213 | if [[ -z `git config user.email` ]]; then 214 | git config user.email "$default_email" 215 | fi 216 | } 217 | 218 | restore_head() { 219 | if [[ $previous_branch = "HEAD" ]]; then 220 | #we weren't on any branch before, so just set HEAD back to the commit it was on 221 | git update-ref --no-deref HEAD $commit_hash $deploy_branch 222 | else 223 | git symbolic-ref HEAD refs/heads/$previous_branch 224 | fi 225 | 226 | git reset --mixed 227 | } 228 | 229 | filter() { 230 | sed -e "s|$repo|\$repo|g" 231 | } 232 | 233 | sanitize() { 234 | "$@" 2> >(filter 1>&2) | filter 235 | } 236 | 237 | parse_args "$@" 238 | 239 | if [ "${command}" = "serve" ]; then 240 | run_serve 241 | elif [[ "${command}" = "build" ]]; then 242 | run_build 243 | elif [[ ${command} = "deploy" ]]; then 244 | if [[ ${no_build} != true ]]; then 245 | run_build 246 | fi 247 | main "$@" 248 | fi 249 | -------------------------------------------------------------------------------- /source/changelog/index.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: سابقه تغییرات API نوبیتکس 3 | lang: fa 4 | toc_footers: 5 | - مستندات API نوبیتکس 6 | - شرایط استفاده از API 7 | - سایت نوبیتکس 8 | --- 9 | 10 | # سابقه تغییرات API نوبیتکس 11 | در این مستند تغییرات هر نسخه از API ها به صورت فهرست‌وار ثبت می‌شود. برای اطلاع از مشروح تغییرات به مستندات متناظر مراجعه نمایید. 12 | 13 | # تغییرات مهم API 14 | 15 | ## تغییرات شهریور ۱۴۰۳ 16 | 17 | * افزودن اندپوینت اردربوک ورژن ۳ و deprecate کردن ورژن ۲ 18 | * اضافه نمودن وب‌سوکت 19 | * اضافه کردن کانال «لیست سفارش‌ها: اردربوک» به وب‌سوکت 20 | 21 | ## تغییرات مرداد ۱۴۰۳ 22 | 23 | * قابلیت دریافت سفارشات به ترتیب زمان ثبت، شناسه و قیمت به صورت صعودی و نزولی در لیست سفارشات 24 | 25 | ## تغییرات مهر ۱۴۰۲ 26 | 27 | * افزودن معاملات خرید تعهدی 28 | 29 | ## تغییرات مرداد ۱۴۰۲ 30 | 31 | * افزودن ضریب به فروش تعهدی 32 | 33 | ## تغییرات اردیبهشت ۱۴۰۲ 34 | 35 | * افزودن انواع سفارش بازار، حد ضرر و OCO به فروش تعهدی 36 | 37 | ## تغییرات بهمن ۱۴۰۱ 38 | 39 | * افزودن معاملات فروش تعهدی 40 | 41 | ## تغییرات مرداد ۱۴۰۱ 42 | 43 | * افزودن کندل دقیقه‌ای به OHLC 44 | 45 | ## تغییرات فروردین ۱۴۰۱ 46 | 47 | * پشتیبانی از سفارش‌های OCO 48 | 49 | ## تغییرات اسفند ۱۴۰۰ 50 | 51 | * پشتیبانی از سفارش‌های حد ضرر (Stop Loss) 52 | * قابلیت ارسال کارت هدیه 53 | 54 | ## تغییرات آذر ۱۴۰۰ 55 | 56 | * **آخرین اعلام برای APIهای قدیمی:** از تاریخ ۱۵ آذر ۱۴۰۰ مواردی که در مستندات به عنوان «قدیمی» مشخص شده‌اند یا در مستندات ذکر نشده‌اند، دیگر مورد پشتیبانی نخواهند بود و باید کدهای استفاده کننده از این موارد تا این تاریخ به‌روزرسانی شوند. 57 | * **حذف متد POST برای دریافت اردربوک:** دریافت اطلاعات اردربوک از تاریخ ۱۵ آذر ۱۴۰۰ تنها با روش جدید موجود در مستندات ممکن است. روش قدیمی که با متد POST مورد استفاده قرار می‌گرفت از این تاریخ دیگر در دسترس نخواهد بود. 58 | * **بهبود خروجی اردربوک:** تعداد سفارش‌های بازگردانده شده در هر سمت اردربوک از ۱۶ به ۲۴ سفارش افزایش یافته است. همین طور امکان استفاده از نماد `all` برای دریافت یکجای تمامی اردربوک‌ها فراهم شده است. به طور کلی نیز سرعت به‌روزرسانی اردربوک بهبود یافته است. 59 | 60 | # سایر تغییرات API 61 | ## تغییرات آذر 1401 62 | 63 | * افزودن امکان فیلتر لیست سفارشات با یک آی دی مبدا 64 | * افزودن امکان جستجوی نماد روی چارت UDF 65 | * افزودن امکان ثبت و دریافت لیست [بازارهای مورد علاقه](/#favorite_market) 66 | 67 | ## تغییرات آبان 1401 68 | 69 | * افزوده شدن کارمزد واریز شناسه دار جیبیت به پاسخ endpoint تنظیمات: [v2/options](/#options) 70 | 71 | ## تغییرات مهر 1401 72 | 73 | * افزوده شدن امکان ثبت و دریافت آنتی‌فیشینگ کد 74 | 75 | ## تغییرات بهمن ۱۴۰۰ 76 | 77 | * ایجاد دیرهنگام کیف پول در زمان استفاده کاربر 78 | * افزودن زمان آخرین به‌روزرسانی به لیست سفارش‌ها (اوردربوک) 79 | 80 | ## تغییرات آبان ۱۴۰۰ 81 | 82 | * افزودن پارامتر hasNext به پاسخ endpoint های زیر: 83 | - /users/transactions-history 84 | 85 | * افزودن کد خطا به endpoint های زیر: 86 | 87 | message | code endpoint 88 | ------- | ---- 89 | msgUnfilledForm | ValidationError /users/wallets/deposit/bank 90 | msgBankAmountLow | AmountTooLow 91 | msgBankAmountHigh | AmountTooHigh 92 | CoinDepositLimitation | CoinDepositLimitation /users/wallets/generate-address 93 | ExchangeRequiredTag | ExchangeRequiredTag /users/wallets/withdraw 94 | msgInvalid2FA | Invalid2FA 95 | WithdrawAmountLimitation | WithdrawAmountLimitation 96 | Insufficient Balance | InsufficientBalance 97 | msgWithdrawLimitReached | WithdrawLimitReached 98 | msgAmountTooLow | AmountTooLow 99 | msgAmountTooHigh | AmountTooHigh 100 | WithdrawAmountLimitation | WithdrawAmountLimitation /users/wallets/withdraw-confirm 101 | Insufficient Balance | InsufficientBalance 102 | Withdraw is not cancelable | NotCancelable /users/wallets/withdraw-cancel 103 | CoinDepositLimitation | CoinDepositLimitation /users/wallets/invoice/generate 104 | CoinDepositDisabled | CoinDepositDisabled 105 | 106 | 107 | # مستندات جدید 108 | 109 | ## مستندات جدید تیر ۱۴۰۱ 110 | 111 | * فهرست معاملات کاربر (/market/trades/list) 112 | 113 | ## مستندات جدید آذر ۱۴۰۰ 114 | 115 | * ثبت درخواست برداشت (/users/wallets/withdraw) 116 | * تایید درخواست برداشت (/users/wallets/withdraw-confirm) 117 | * لیست برداشت‌ها (/users/wallets/withdraws/list) 118 | * مشاهده برداشت (/withdraws/`ID`) 119 | 120 | ## مستندات جدید آبان ۱۴۰۰ 121 | 122 | * لیست سفارشات همه بازارها (/v2/orderbook/all) 123 | * تاریخچه تراکنش‌های مالی کاربر (/users/transactions-history) 124 | * لیست معاملات صرافی (/exchange/trades-list) 125 | * ثبت معامله در صرافی (/exchange/create-trade) 126 | * دریافت قیمت از صرافی (/exchange/estimate) 127 | * CRUD اعلان قیمت (/v2/price-alerts) 128 | * غیرفعال‌سازی شناسایی دوعاملی (/users/tfa/disable) 129 | * تایید شناسایی دوعاملی (/users/tfa/confirm) 130 | * فعال‌سازی شناسایی دوعاملی (/users/tfa/request) 131 | * تفسیر صورت‌حساب (/users/wallets/invoice/decode) 132 | * ایجاد صورت‌حساب واریز (/users/wallets/invoice/generate) 133 | * لیست نوتیفیکیشن‌ها (/notifications/list) 134 | 135 | 136 | ## تغییرات مهر ۱۴۰۳ 137 | 138 | * حذف پارامتر availableBalance از پاسخ endpoint های زیر: 139 | - /liquidity-pools/list 140 | -------------------------------------------------------------------------------- /source/deprecated/index.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: موارد قدیمی API 3 | lang: fa 4 | toc_footers: 5 | - مستندات API نوبیتکس 6 | - سابقه تغییرات API 7 | - شرایط استفاده از API 8 | - سایت نوبیتکس 9 | --- 10 | 11 | # موارد قدیمی API 12 | برخی از APIها به دلیل تغییرات ساختاری یا کارکردی، قدیمی و deprecated محسوب می‌شوند و نباید دیگر از آن‌ها استفاده شود. این موارد صرفاً جهت ثبت در ادامه خواهند آمد، ولی ممکن است در حال حاضر یا هر یک از نسخه‌های آتی نوبیتکس این APIها غیرفعال شوند یا دیگر پاسخگو نباشند. 13 | 14 | ## کد دعوت پیش‌فرض 15 | 16 | ```shell 17 | curl 'https://api.nobitex.ir/users/get-referral-code' \ 18 | -H "Authorization: Token yourTOKENhereHEX0000000000" 19 | ``` 20 | 21 | ```plaintext 22 | http POST https://api.nobitex.ir/users/get-referral-code \ 23 | ``` 24 | 25 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 26 | 27 | ```json 28 | { 29 | "status": "ok", 30 | "referredUsersCount": 0, 31 | "referralCode": "84440", 32 | "referralFeeTotalCount": 0, 33 | "referralFeeTotal": 0 34 | } 35 | ``` 36 | 37 | برای دریافت کد دعوت پیش‌فرض از این نوع درخواست استفاده نمایید: 38 | 39 | - آدرس : `GET /users/get-referral-code` 40 | 41 | 42 | 43 | ## لیست سفارشـات 44 | 45 | ```shell 46 | curl 'https://api.nobitex.ir/v2/orderbook' 47 | -X POST -H "content-type: application/json" 48 | --data '{"symbol": "USDTIRT"}' 49 | ``` 50 | 51 | ```plaintext 52 | http POST https://api.nobitex.ir/v2/orderbook \ 53 | symbol=USDTIRT 54 | ``` 55 | 56 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 57 | 58 | ```json 59 | { 60 | "status": "ok", 61 | "bids": [ 62 | [ 63 | "1476091000", 64 | "1.016" 65 | ], 66 | [ 67 | "1479700000", 68 | "0.2561" 69 | ] 70 | ], 71 | "asks": [ 72 | [ 73 | "1470001120", 74 | "0.126571" 75 | ], 76 | [ 77 | "1470000000", 78 | "0.818994" 79 | ] 80 | ] 81 | } 82 | ``` 83 | 84 | برای دریافت لیست سفارشات از این نوع درخواست استفاده نمایید: 85 | 86 | - آدرس : `POST /v2/orderbook` 87 | 88 | 89 | ##لیست معامـلات 90 | 91 | ```shell 92 | curl 'https://api.nobitex.ir/v2/trades' 93 | -X POST -H "content-type: application/json" 94 | --data '{"symbol": "USDTIRT"}' 95 | ``` 96 | 97 | ```plaintext 98 | http POST https://api.nobitex.ir/v2/trades \ 99 | symbol=USDTIRT 100 | ``` 101 | 102 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 103 | 104 | ```json 105 | { 106 | "status": "ok", 107 | "trades": [ 108 | { 109 | "time": 1588689375067, 110 | "price": "1470000110", 111 | "volume": "0", 112 | "type": "sell" 113 | }, 114 | { 115 | "time": 1588689360464, 116 | "price": "1470000110", 117 | "volume": "0.002", 118 | "type": "buy" 119 | } 120 | ] 121 | } 122 | ``` 123 | 124 | برای دریافت لیست معاملات از این نوع درخواست استفاده نمایید: 125 | 126 | - آدرس : `POST /v2/trades ` 127 | -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum).eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum).eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Black.eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Bold.eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Light.eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_Medium.eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_UltraLight.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum)_UltraLight.eot -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum).ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum).ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Black.ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Bold.ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Light.ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_Medium.ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_UltraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum)_UltraLight.ttf -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum).woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum).woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Black.woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Bold.woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Light.woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_Medium.woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_UltraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum)_UltraLight.woff -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum).woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum).woff2 -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Black.woff2 -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Bold.woff2 -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Light.woff2 -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_Medium.woff2 -------------------------------------------------------------------------------- /source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_UltraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Black-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Black-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Black-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Black-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Black-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Black-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Black-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Black-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Bold-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Bold-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Bold-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Bold-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Bold-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Bold-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Bold-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Bold-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Light-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Light-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Light-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Light-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Light-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Light-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Light-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Light-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Medium-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Medium-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Medium-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Medium-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Medium-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Medium-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Medium-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Medium-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Regular-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Regular-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Regular-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Regular-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Regular-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Regular-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Regular-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Regular-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Thin-FD.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Thin-FD.eot -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Thin-FD.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Thin-FD.ttf -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Thin-FD.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Thin-FD.woff -------------------------------------------------------------------------------- /source/fonts/Vazir/Vazir-Thin-FD.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/Vazir/Vazir-Thin-FD.woff2 -------------------------------------------------------------------------------- /source/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/slate.eot -------------------------------------------------------------------------------- /source/fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /source/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/slate.ttf -------------------------------------------------------------------------------- /source/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/slate.woff -------------------------------------------------------------------------------- /source/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/fonts/slate.woff2 -------------------------------------------------------------------------------- /source/images/active-convertor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/active-convertor.jpg -------------------------------------------------------------------------------- /source/images/active-gateway.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/active-gateway.jpg -------------------------------------------------------------------------------- /source/images/active-plugin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/active-plugin.jpg -------------------------------------------------------------------------------- /source/images/converter-admin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/converter-admin.jpg -------------------------------------------------------------------------------- /source/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/favicon.ico -------------------------------------------------------------------------------- /source/images/gateway-setting.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/gateway-setting.jpg -------------------------------------------------------------------------------- /source/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/logo.png -------------------------------------------------------------------------------- /source/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/navbar.png -------------------------------------------------------------------------------- /source/images/nobitex-dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/nobitex-dashboard.jpg -------------------------------------------------------------------------------- /source/images/plugin-upload.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nobitex/docs-api/059f247ee514d0ae9189ba3c1f6db198b9f377be/source/images/plugin-upload.jpg -------------------------------------------------------------------------------- /source/includes/_auth.md: -------------------------------------------------------------------------------- 1 |

احراز هویت

2 | 3 |

روش پیشنهادی دریافت توکن

4 | 5 | روش پیشنهادی نوبیتکس برای دریافت توکن استفاده از API، دریافت آن از پنل کاربری است. برای دریافت توکن می‌توانید با مراجعه به پنل کاربری خود در نوبیتکس، از بخش پروفایل وارد صفحه تنظیمات شده و توکن خود را دریافت نمایید. در صورتی که گزینه «مرا به خاطر بسپار» را در هنگام ورود به نوبیتکس انتخاب کرده باشید، این توکن تا ۳۰ روز یا زمان لاگ‌اوت شما از نوبیتکس معتبر خواهد ماند. 6 | 7 | در ادامه روش دریافت خودکار توکن با استفاده از کد توضیح داده می‌شود. معمولاً دریافت خودکار توکن ضروری نیست و روش پیشنهادی ما برای اغلب کاربران دریافت مستقیم توکن از پنل کاربری است. تنها در صورتی که با مخاطرات ذخیره گذرواژه خود در کد و روش‌های امن این کار آشنا هستید، در استفاده از API مهارت دارید، و از طرفی نیاز به دریافت کاملاً خودکار توکن دارید، از API دریافت توکن استفاده نمایید. 8 | 9 | همین طور پیشنهاد می‌شود که گام‌های اولیه توسعه کد خود را با دریافت توکن از پنل انجام دهید تا با فرآیند استفاده از API نوبیتکس بیشتر آشنا شوید و تنها در صورت نیاز و در گام نهایی‌سازی کد خود اقدام به خودکارسازی دریافت توکن نمایید. لازم به توضیح است که به دلیل مسائل امنیتی مانند شناسایی دوعاملی و کپچا و ... برای دریافت خودکار توکن باید به دقت مستندات این بخش را مطالعه نمایید. 10 | 11 |

ورود - دریافت توکن

12 | > برای دریافت توکن، از این کد استفاده کنید: 13 | 14 | ```shell 15 | curl 'https://api.nobitex.ir/auth/login/' \ 16 | -X POST \ 17 | -H "Content-Type: application/json" \ 18 | --data $'{"username":"name@example.com","password":"secret-password-1234","captcha":"api"}' 19 | ``` 20 | 21 | ```plaintext 22 | http POST https://api.nobitex.ir/auth/login/ \ 23 | username=name@example.com password=secret-password-1234 captcha=api 24 | ``` 25 | 26 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 27 | 28 | ```json 29 | { 30 | "status": "success", 31 | "key": "db2055f743c1ac8c30d23278a496283b1e2dd46f", 32 | "device": "AlRyansW" 33 | } 34 | ``` 35 | 36 | دریافت توکن به صورت خودکار و با ارسال درخواست به `/auth/login/` صورت می‌گیرد. این تنها APIی است که نیاز دارید 37 | به آن نام کاربری و رمز عبور خود را ارسال کنید. تمامی دیگر APIها از توکن به جای رمز عبور برای احراز هویت استفاده می‌کنند. 38 | توکن‌های صادر شده بعد از چهار ساعت منقضی می‌شوند و باید مجددا با ارسال درخواست لاگین، توکن جدیدی دریافت کنید. 39 | در صورتی که نیاز به ایجاد توکن‌های بلند مدت دارید، از پارامتر `remember=yes` استفاده کنید تا توکن ایجاد شده به مدت سی 40 | روز معتبر بماند. 41 | توجه داشته باشید، در صورتی که احراز هویت دو مرحله‌ای را فعال کرده باشید، می بایست رمز یک‌بار مصرف را نیز ارسال نمایید. توضیحات دقیق‌تر را از اینجا مطالعه فرمایید. 42 | 43 | 44 | * **درخواست:** `/POST /auth/login ` 45 | * **محدودیت فراخوانی:** ۳۰ درخواست در هر ۱۰ دقیقه 46 | 47 | 48 | ### پارامترهای ورودی 49 | 50 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 51 | ------- | ---- | --------- | --------- | ----- 52 | username | string | الزامی | ایمیل کاربر | `name@example.com` 53 | password | string | الزامی | گذرواژه کاربر | `secret-password-1234` 54 | remember | string | no | آیا توکن بلند مدت صادر شود؟ | `yes` یا `no` 55 | captcha | string | الزامی | کپچا | `api` 56 | 57 | ### نکات و ملاحظات 58 | 59 | 1. دقت نمایید که انتهای آدرس url ارسال درخواست، حتماً باید `/` گذاشته شود. 60 | 2. توکن‌های دریافت شده از این روش، بعد از اتمام زمان اعتبار یا انجام عملیات لاگ‌اوت منقضی می‌شوند. زمان پیش‌فرض اعتبار توکن چهار ساعت است که می‌توانید با استفاده از پارامتر `remember` توکن‌هایی با زمان اعتبار یک ماه دریافت نمایید. 61 | 3. برای لاگین و دریافت توکن، حتماً باید از آی‌پی ایران درخواست ارسال شود. در غیر این صورت، خطای 429 برگردانده می‌شود. بدیهی است که استفاده از هر VPN یا VPS خارجی، منجر به این خطا خواهد شد. در حالت استفاده از آی‌پی ایران می‌توانید مقدار کپچا را در درخواست برابر `api` مقداردهی کنید. 62 | 4. در صورت مشکل در دریافت توکن، می‌توانید مطابق [روش پیشنهادی](#auth-intro) دریافت توکن از توکن‌‌های موجود در تنظیمات پروفایل خود استفاده کنید. 63 | 64 | 65 |

سوالات متداول دریافت توکن

66 | 67 | ### آیا نوبیتکس توکن بلند مدت هم ارائه می‌دهد؟ 68 | در نوبیتکس می‌توانید توکن‌هایی با تاریخ انقضای حداکثر یک ماه دریافت نمایید. در صورتی که گزینه «مرا به خاطر بسپار» را در زمان لاگین به سایت نوبیتکس انتخاب نمایید، توکنی که در بخش پروفایل دریافت می‌کنید برای مدت یک ماه معتبر خواهد بود. در صورتی که از API دریافت توکن استفاده می‌کنید، می‌توانید از پارامتر `remember` استفاده کنید. مد نظر داشته باشید که در صورت انجام عملیات لاگ‌اوت از حساب خود در سایت یا API توکن شما دیگر معتبر نخواهد ماند. 69 | 70 | ### من با استفاده از گوگل در نوبیتکس ثبت نام کرده‌ام. چگونه می‌توانم با API کار کنم؟ 71 | [روش پیشنهادی](#auth-intro) دریافت توکن، دریافت آن از پنل کاربری است و با این روش تمام کاربران مستقل از روش ورود به نوبیتکس می‌توانند توکن خود را مشاهده و دریافت نمایند. کاربرانی که با استفاده از حساب گوگل در نوبیتکس ثبت‌نام کرده باشند و بخواهند از روش خودکار دریافت توکن استفاده کنند، می‌توانند از امکان فراموشی رمز عبور استفاده کرده و رمز جدید برای حساب خود تعیین و پس از آن اقدام به استفاده از API نمایند. 72 | 73 | ### در هنگام لاگین با خطای MissingCaptcha روبرو شده‌ام. مشکل چیست؟ 74 | مطابق [روش پیشنهادی](#auth-intro) دریافت توکن، برای دریافت توکن به پنل کاربری خود در سایت، بخش «پروفایل: تنظیمات» مراجعه نمایید. اگر از روش خودکار دریافت توکن استفاده می‌کنید، مستندات مربوطه را با دقت مطالعه نمایید. 75 | 76 | ### در هنگام لاگین با خطای MissingOTP روبرو شده ام. چگونه این مشکل حل میشود؟ 77 | هنگامی که شناسایی دوعاملی حساب شما فعال باشد، در هنگام استفاده از API نیز می‌بایست این حالت حفظ شده و رمز یکبار مصرف ارسال گردد. این کار از طریق ارسال این رمز با استفاده از پارامتر X-TOTP امکان‌پذیر خواهد بود. تولید کد دوعاملی با استفاده از فرمول استانداردی در کد ممکن است. 78 | 79 | 80 |

خروج - سوزاندن توکن

81 | > برای خروج یا سوزاندن توکن، از این کد استفاده کنید: 82 | 83 | ```shell 84 | curl -X POST 'https://api.nobitex.ir/auth/logout/' \ 85 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 86 | ``` 87 | 88 | ```plaintext 89 | POST /auth/logout/ HTTP/1.1 90 | Host: api.nobitex.ir 91 | Authorization: Token yourTOKENhereHEX0000000000 92 | ``` 93 | 94 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 95 | 96 | ```json 97 | { 98 | "detail": "خروج با موفقیت انجام شد.", 99 | "message": "خروج با موفقیت انجام شد." 100 | } 101 | ``` 102 | 103 | - **درخواست:** `/POST /auth/logout ` 104 | -------------------------------------------------------------------------------- /source/includes/_faq.md: -------------------------------------------------------------------------------- 1 |

سوالات متداول

2 | 3 |

سوالی در مورد لاگین و دریافت توکن دارم

4 | در این زمینه ابتدا مطالعه توضیحات [احراز هویت و توکن](#intro-auth)، [راهنمای شروع به کار با API](#quickstart) و [روش پیشنهادی دریافت توکن](#auth-intro) پیشنهاد می‌شود. سپس می‌توانید در بخش [سوالات متداول دریافت توکن](#login-faq) برخی سوالات متداول در این زمینه را مشاهده کنید. 5 | 6 | 7 | ## آیا نوبیتکس محیط آزمایشی (Test) دارد؟ 8 | بله، شما میتوانید برای استفاده از کلیه امکانات بازار نوبیتکس و همچنین api ها از محیط آزمایشی نوبیتکس به آدرس‌های ذیل استفاده نمائید: 9 | 10 | آدرس نوبیتکس آزمایشی : https://testnet.nobitex.ir 11 | 12 | آدرس api آزمایشی : https://testnetapi.nobitex.ir 13 | 14 | 15 | ## آیا برای استفاده از apiها محدودیتی وجود دارد؟ 16 | بله، برای مثال شما حتماً باید از IPهای ایران درخواست خود را ارسال نمائید، و یا محدودیت‌های مخصوص به هر api که در توضیحات هر کدام از endpointها آورده شده است. 17 | 18 | 19 | ## فرمت استفاده شده برای تاریخ چیست؟ 20 | ساعت یونیکس Unix Time 21 | یکی از مقیاس اندازه‌گیری زمان آنی است. این عدد که تعداد ثانیه‌ها از ساعت ۰۰:۰۰:۰۰ ساعت هماهنگ جهانی اول ژانویه ۱۹۷۰ است، شامل ثانیه‌های کبیسه نمی‌شود. برای زمان‌های قبل از اول ژانویه از اعداد منفی استفاده می‌شود. 22 | 23 | به عنوان مثال [۰۱/۰۱/۱۹۷۰ ۰۰:۰۰:۰۰] برابر با صفر (۰) و [۰۱/۰۱/۱۹۷۰ ۰۰:۰۱:۰۰] برابر با شصت(۶۰) است. 24 | 25 | فرمول اصلی آن به این صورت می‌باشد: 26 | 27 | تعداد (روزهای گذشته از اول ژانویه ۱۹۷۰) × ۸۶۴۰۰(تعداد ثانیه‌های هر روز) 28 | 29 | به منظور مطالعه بیشتر به آدرس زیر مراجعه نمائید 30 | https://en.wikipedia.org/wiki/Unix_time 31 | 32 | 33 | ## آیا برای apiها کدهای نمونه تهیه شده است؟ 34 | بله، collection کلیه api ها برای استفاده در برنامه postman تهیه و از اینجا میتوانید به آن دسترسی داشته باشید. در این collection شما میتوانید نمونه فراخوانی هر کدام از این apiها را به زبان‌های مختلف برنامه نویسی نظیر پی اچ پی، پایتون، سی شارپ و … در این مجموعه مشاهده کرده و آن را در سیستم خود اجرا نمائید. 35 | -------------------------------------------------------------------------------- /source/includes/_general_notes.md: -------------------------------------------------------------------------------- 1 |

ملاحظات عمومی

2 | 3 | ## راهنمای اشکال‌یابی 4 | * به نوع درخواست دقت کنید، احتمال دارد درخواست از نوع `HTTP POST` باشد و شما از `GET` استفاده کرده باشید. 5 | * آدرس API را مجددا بررسی نمایید. همچنین به وجود یا عدم وجود `/` در انتهای آدرس دقت کنید. 6 | 7 | ## پاسخ‌های موفق 8 | > نمونه پاسخ موفق: 9 | 10 | ``` json 11 | { 12 | "status": "ok", 13 | "otherFields": "..." 14 | } 15 | ``` 16 | 17 | در تمامی API ها در صورتی که عملیات مد نظر به درستی انجام شده باشد، پاسخ به صورت یک شی در قالب JSON 18 | بازگردانده می‌شود و با وضعیت `HTTP 200` است. این پاسخ در حالت موفق یک کلید `status` با مقدار `ok` دارد. 19 | بنا به API مورد استفاده ممکن است یک یا چند کلید دیگر نیز در این پاسخ بازگردانده شود. 20 | 21 | ## پاسخ‌های ناموفق 22 | > نمونه پاسخ ناموفق: 23 | 24 | ``` json 25 | { 26 | "status": "failed", 27 | "code": "ErrorCode", 28 | "message": "Human-readable error message" 29 | } 30 | ``` 31 | 32 | در تمامی APIها در صورتی که به هر دلیل امکان پردازش و انجام آن درخواست وجود نداشته باشد، یک پاسخ ناموفق 33 | بازگردانده می‌شود. پاسخ‌های ناموفق به دو صورت هستند، یا با کد خطای HTTP مشخص می‌شوند که مطابق با معانی 34 | وضعیت در پروتکل HTTP قابل تفسیر هستند. 35 | 36 | در صورتی که پارامترهای ورودی قابل تفسیر باشند، ولی عملیات مد نظر قابل انجام نباشد، پاسخ با وضعیت `HTTP 200` بازگردانده 37 | می‌شود، و توضیحات تکمیلی به صورت یک شی در قالب JSON خواهد بود که مقدار کلید `status` آن برابر `failed` است. 38 | کلید `code` در این شرایط، خطای دقیق رخ داده شده را مشخص می‌کند که در بخش «حالت‌های خطا» در توضیحات هر API 39 | فهرستی از کدهای خطای ممکن و توضیحات آن ارائه شده است. معمولاً در یک کلید `message` توضیح بیشتری در مورد آن 40 | خطا نیز ارائه می‌شود که جهت رفع عیب یا نمایش مستقیم به کاربر نهایی می‌تواند مفید باشد. 41 | 42 | 46 | 47 | ### برخی وضعیت‌های پرکاربرد 48 | کد HTTP | عنوان | توضیحات | ‌ 49 | ---- | ---- | ---- | ---- 50 | 200 | OK | درخواست دریافت و پاسخ داده شده، وضعیت اصلی درخواست در فیلد status پاسخ مشخص می‌شود. | 51 | 400 | Bad Request | پارامترهای درخواست نادرست یا ناکافی است به طوری که امکان بررسی بیشتر و پاسخ بهتر به آن وجود ندارد. | 52 | 401 | Unauthorized | کاربر [احراز هویت](#intro-auth) نشده است | 53 | 403 | Forbidden | انجام این عملیات مجاز نمی‌باشد | 54 | 404 | Not Found | آدرس یا شی مد نظر وجود ندارد | 🐱 55 | 500 | Internal Server Error | مشکلی به صورت موقت در سرور نوبیتکس رخ داده است | 🐱 56 | 57 |

صفحه‌بندی

58 | پارامترهای زیر در API های دریافت لیست دارای صفحه‌بندی قابل استفاده است: 59 | 60 | | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه | 61 | |----------|-----|---------|-------------|-------| 62 | | page | int | اختیاری | شماره صفحه | 2 | 63 | | pageSize | int | اختیاری | اندازه صفحه | 10 | 64 | 65 | 68 | 69 | 72 | 73 | 74 |

فیلتر زمانی

75 | پارامترهای زیر در API های دریافت لیست قابل فیلتر زمانی قابل استفاده است: 76 | 77 | | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه | 78 | |---------|------|---------|----------|--------------| 79 | | from | date | اختیاری | از تاریخ | `2022-05-12` | 80 | | to | date | اختیاری | تا تاریخ | `2022-07-22` | 81 | 82 | 83 | ## مقادیر پولی (monetary) 84 | در موارد متعددی پارامترهای ورودی درخواست‌ها از نوع مقدار پولی یا monetary مشخص شده است. برای داشتن بالاترین دقت، پیشنهاد می‌شود که این مقادیر را به صورت رشته‌ای ارسال نمایید، چرا که استفاده از انواع داده‌ای مانند `float` در کاربردهای دقیق مالی توصیه نمی‌شود. 85 | 86 | ## اعتبارسنجی دو عاملی 87 | در صورتی که اعتبارسنجی دو عاملی (2 Factor Authentication) را برای حساب خود فعال کرده باشید، باید در هنگام استفاده از برخی APIها، 88 | به خصوص در هنگام دریافت توکن از API لاگین، علاوه بر سایر پارامترها، رمز یک‌بار مصرف خود را نیز در هدرهای درخواست به این صورت ارسال نمایید: 89 | `X-TOTP: 123456`. 90 | 91 |

محدودیت‌های فراخوانی API

92 | برخی از APIهای نوبیتکس دارای محدودیت تعداد فراخوانی در هر بازه‌ی زمانی هستند. با این حال اگر شما به صورت معمولی و مشابه 93 | استفاده‌ی متداول کاربران از API استفاده کنید، با این محدودیت‌ها مواجه نخواهید شد. محدودیت‌ها به ازای هر API مستقلا محاسبه 94 | و اعمال می‌شوند. محدودیت‌ها معمولا بر اساس آدرس IP درخواست دهنده و در موارد هم بر اساس کاربر (توکن) درخواست دهنده می‌باشند. 95 | در حالتی که به حد مجاز تعداد فراخوانی یک API رسیده باشید، پاسخ آن API به شما یک پیام خطا با کد 403 و دارای توضیحات مشخص 96 | در خصوص آن محدودیت خواهد بود. 97 | 98 | در صورتی که به صورت موردی یا در حین تست کد خود به محدودیتی برخورد کردید، می‌توانید با 99 | منتظر ماندن (بین یک ساعت تا یک روز) آن محدودیت را برطرف کنید و دوباره امکان استفاده از API مد نظرتان را داشته باشید. اگر به 100 | صورت مداوم به محدودیتی برای یک API برخورد می‌کنید و فکر می‌کنید که بهتر است تعداد فراخوانی مجاز آن API افزایش یابد، حتما با 101 | ایجاد یک مورد در گیت‌هاب ([لینک ایجاد مورد](https://github.com/nobitex/docs-api/issues/new)) مسئله را با ما مطرح نمایید. 102 | 103 |

محدودیت مشترک APIهای سفارش‌گذاری

104 | توجه داشته باشید که تمامی API‌های مربوط به ثبت سفارش دارای محدودیت مشترک روی تعداد سفارش‌هایی که ثبت می‌شوند هستند. برای مثال، اگر همزمان هم در بازار اسپات و هم در بازار تعهدی سفارش ثبت می‌کنید، محدودیت فراخوانی شامل مجموع سفارش‌های ثبت شده در این دو بازار می‌شود. 105 | 106 | مقدار محدودیت مشترک: ۳۰۰ درخواست در ۱۰ دقیقه 107 | 108 | 109 | 110 | ## حالت متداول و Pro 111 | در برخی از درخواست‌ها جهت حفاظت بهتر از کاربران، برخی محدودیت‌ها اعمال می‌شود. در چنین مواردی در بخش ملاحظات این محدودیت‌ها توضیح داده شده و در انتهای آن عبارت «غیرفعال در حالت Pro» ذکر شده است. با ارائه پارامتر `pro` به مقدار `yes` به عنوان ورودی، این محدودیت برای آن درخواست غیرفعال می‌شود. با این حال دقت کنید که محدودیت‌های حالت متداول برای جلوگیری از حالت‌های خاص و اشتباهات رایج تعبیه شده است و تنها در صورت نیاز و آگاهی از تبعات احتمالی آن، اقدام به فعال‌سازی حالت Pro نمایید. 112 | -------------------------------------------------------------------------------- /source/includes/_intro.md: -------------------------------------------------------------------------------- 1 | # مستندات API نوبیتکس 2 | 3 | ``` 4 | NOBITEX 5 | ``` 6 | 7 | به مستندات API [نوبیتکس](https://nobitex.ir)، بزرگترین بازار ارز دیجیتال ایران خوش آمدید. نوبیتکس از ابتدای کار API خود را در اختیار تمامی کاربران و توسعه‌دهندگان گرامی قرار داده است. با استفاده از API نوبیتکس می‌توانید علاوه بر اطلاع از آخرین قیمت‌ها و وضعیت بازار رمزارزها در ایران، اقدام به مدیریت حساب نوبیتکس خود به روش خودکار و مبتنی بر کد نمایید. استفاده از API علاوه بر فراهم‌سازی امکانات نوین برای کاربران، امکان انجام معاملات خودکار که باعث سیال و منصفانه‌تر شدن قیمت در بازارها می‌شود را فراهم می‌کند. 8 | 9 | پیش از استفاده از API نوبیتکس اطمینان حاصل کنید که با 10 | [قوانین نوبیتکس](https://nobitex.ir/policies/terms/) 11 | و همچنین 12 | [قوانین و شرایط استفاده از API نوبیتکس](/terms/) 13 | آشنایی کامل دارید. 14 | همین طور با توجه به احتمال ایجاد تغییرات در بستر نوبیتکس یا ساختار و جزئیات APIها، همواره به اطلاعیه‌های 15 | [کانال رسمی تلگرام نوبیتکس](https://t.me/nobitexmarket) 16 | و [کانال رسمی تلگرام API نوبیتکس](https://t.me/NobitexAPINews) 17 | دقت کنید. به علاوه به صورت مستمر 18 | [صفحه سابقه تغییرات API نوبیتکس](/changelog/) 19 | را رصد کنید تا از تمامی تغییرات API نوبیتکس مطلع باشید. 20 | 21 | در استفاده از API همواره اطمینان حاصل کنید که کد شما قابلیت مواجهه با حالت‌های خطا و شرایط و تغییرات پیش‌بینی نشده را داشته باشد و عکس العمل مناسبی در این خصوص نشان دهد. با توجه به حساسیت‌های بازارهای مالی، لازم است که کدهای استفاده کننده از API به صورت اصولی و با ملاحظاتی مانند کنترل نرخ درخواست‌ها در شرایط مختلف، مدیریت حالت‌های خطا، پیش‌گیری از تشدید آبشاری خطاها، سازوکارهای حفاظت در عمق، وجود سامانه‌های مانیتورینگ و اعلان، وجود سازوکارهای مدیریت ریسک و ... توسعه داده شود. 22 | 23 | اگر برای اولین بار است که از API نوبیتکس استفاده می‌کنید، می‌توانید از بخش 24 | راهنمای شروع به کار با API 25 | کمک بگیرید. 26 | 27 |

احراز هویت و توکن

28 | ``` 29 | Authorization: Token yourTOKENhereHEX0000000000 30 | ``` 31 | 32 | برای استفاده از APIهای غیر عمومی نیاز به ارسال توکن وجود دارد. این توکن باید به عنوان HTTP Header درخواست به صورت زیر ارسال شود: 33 | 34 | `Authorization: Token yourTOKENhereHEX0000000000` 35 | 36 | به جز APIهای بخش‌هایی که عنوان «عمومی» در انتهای نام‌شان آورده شده باشد، برای استفاده از تمام APIها نیاز به ارسال توکن وجود دارد. توکن مشخص می‌کند که کدام کاربر در حال ارسال این درخواست است. 37 | 38 | 43 | 44 | برای دریافت توکن می‌توانید با مراجعه به پنل کاربری خود در نوبیتکس، از بخش پروفایل وارد 45 | صفحه تنظیمات 46 | شده و توکن خود را دریافت نمایید. در صورتی که گزینه «مرا به خاطر بسپار» را در هنگام ورود به نوبیتکس انتخاب کرده باشید، این توکن تا ۳۰ روز یا زمان لاگ‌اوت شما از نوبیتکس معتبر خواهد ماند. 47 | 48 | در صورت تمایل به دریافت دوره‌ای و خودکار توکن، می‌توانید از 49 | API ورود - دریافت توکن 50 | استفاده نمایید. ولی این کار ضروری نیست و روش پیشنهادی ما برای اغلب کاربران دریافت مستقیم توکن از پنل کاربری است. تنها در صورتی که با مخاطرات ذخیره گذرواژه خود در کد و روش‌های امن این کار آشنا هستید، در استفاده از API مهارت دارید، و از طرفی نیاز به دریافت کاملاً خودکار توکن دارید، از API دریافت توکن استفاده نمایید. 51 | 52 | 53 |

تنظیم User Agent

54 | جهت شناسایی و تفکیک بهتر بات‌ها و پشتیبانی از آن‌ها، اکیداً توصیه می‌شود که در تمامی درخواست‌ها مقدار UserAgent را مطابق الگوی `TraderBot/XXXXX` ارسال نمایید، که بخش `XXXXX` هر نام یکتایی است که می‌توانید برای بات خود انتخاب کنید. با رعایت این نام‌گذاری پاسخگویی به درخواست‌های پشتیبانی و عیب‌یابی مشکلات بهتر صورت می‌گیرد. 55 | 56 | 57 |

محدودیت‌ها

58 | توجه داشته باشید، برای استفاده از APIها محدودیت هایی وجود دارد که در قسمت توضیحات هر کدام از APIها این موارد ذکر شده است. 59 | 60 | همچنین به منظور حفظ امنیت حساب کاربران، در هنگام احرازهویت(لاگین)، در صورتی که دستگاه شما جدید شناخته شود، محدودیت برداشت به مدت یک‌ساعت روی حساب کاربری شما اعمال خواهد شد. کاربرانی که فرایند دریافت توکن با زمان کمتر از این یک‌ساعت دارند میتوانند مقدار device را که در جواب دریافت توکن دریافت کرده‌اند را در مراحل بعدی به همراه دیگر پارامترها ارسال، تا از اعمال این محدودیت جلوگیری نمایند. 61 | 62 | روش دیگری که پیش و روی شماست استفاده از توکن‌های بلندمدت است. 63 | 64 |

تغییرات و موارد قدیمی

65 | با توجه به ماهیت نوین و تغییرات مستمر مورد نیاز در حوزه رمزارزها، در API نوبیتکس نیز ممکن است در طول زمان تغییراتی ایجاد شود. پشتیبانی طولانی‌مدت از نسخه‌های قدیمی API معمولاً فرآیندی پیچیده و سخت است و باعث کاهش سرعت ایجاد تغییرات جدید در بستر نوبیتکس می‌شود. به همین دلیل API نوبیتکس همواره در عین حفظ ساختار کلی و اجزای اصلی ثابت، در حال بهبود مستمر و به‌روزرسانی است. کاربران گرامی می‌توانند با پیگیری تغییرات API که در [صفحه سابقه تغییرات API نوبیتکس](/changelog/) اطلاع‌رسانی می‌شود، همواره از تغییرات احتمالی ضروری در کد خود مطلع شوند تا بتوانند به صورت بدون وقفه از جدیدترین امکانات و روش‌های دسترسی به API نوبیتکس بهره‌مند شوند. 66 | 67 | مواردی که قبلاً در API موجود بودند ولی در حال حاضر پشتیبانی نمی‌شوند، جهت ثبت سابقه در [صفحه API قدیمی](/deprecated/) موجود هستند. ممکن است APIهای دیگری علاوه بر موارد مستند شده در مستندات پیش‌رو وجود داشته باشند، که این موارد جز API رسمی نوبیتکس نبوده و تضمینی در قبال ادامه‌دار بودن پشتیبانی از آن‌ها وجود ندارد. همین طور در استفاده از APIهای فعلی لازم به توضیح است که ممکن است علاوه بر فیلدهایی که در ورودی یا خروجی مستند شده است، فیلدهای دیگری نیز وجود داشته باشند. این فیلدها تا زمانی که در مستندات اضافه نشده باشند باید به عنوان امکانات آزمایشی و موقت در نظر گرفته شوند و نباید مورد استفاده عموم کاربران قرار گیرد. تنها کافی است که کدهای توسعه داده شده در صورت مشاهده فیلدی غیر از فیلدهای مورد انتظار خود، دچار خطا نشوند و صرفاً وجود آن فیلد را نادیده بگیرند. 68 | 69 |

راهنمای حل مشکلات

70 | 71 | در صورتی که پاسخ مد نظر خود را از API دریافت نمی‌کنید، ابتدا اطمینان حاصل کنید که تمامی موارد ذکر شده در مستندات مربوطه را به درستی رعایت کرده باشید. بهترین روش حل مشکلات برنامه‌نویسی سعی در ریشه‌یابی مشکلات با تغییر متغیرها و بررسی تمام حالت‌ها و استفاده از روش‌های مرسوم عیب‌یابی کد است. 72 | 73 | در صورت حل نشدن مشکل، مراجعه به بخش [سوالات متداول](#faq) و [ملاحظات عمومی](#general-considerations) می‌تواند در عیب‌یابی مفید باشد. همین طور اگر مشکل مربوط به حساب شما باشد و اقدامی را نه از طریق API و نه از طریق سایت نوبیتکس نتوانید انجام دهید، باید با 74 | پشتیبانی آنلاین نوبیتکس 75 | در ارتباط باشید. 76 | 77 | در صورتی که بخشی از مستندات API مبهم است، یا پیشنهادی درباره APIهای موجود دارید، یا پس از بررسی کامل اطمینان دارید که مشکلی در API نوبیتکس وجود دارد، می‌توانید در 78 | مخزن گیت‌هاب مستندات نوبیتکس API 79 | مورد (issue) جدیدی را ایجاد نمایید و با ما در ارتباط باشید. دقت کنید که این کانال عمومی است و نباید در آن هیچ گونه اطلاعات حساس یا توکن یا سایر اطلاعات حساب خود را مطرح کنید. 80 | 81 | 82 |

راهنمای شروع به کار با API

83 | 84 | اگر برای اولین بار از API نوبیتکس یا سایر بازارهای رمزارز استفاده می‌کنید، برای شروع کار پیشنهاد می‌شود گام‌های زیر را طی کنید: 85 | 86 | * برای شروع کار با API پیشنهاد می‌شود که ابتدا در نوبیتکس 87 | ثبت‌نام 88 | نمایید و مراحل احراز هویت خود را حداقل تا سطح یک انجام دهید. 89 | * با مراجعه به پنل کاربری خود در نوبیتکس، از بخش پروفایل وارد 90 | صفحه تنظیمات 91 | شده و توکن خود را دریافت نمایید. دسترسی به این توکن به منزله دسترسی کامل به حساب شماست، در نتیجه در حفاظت آن دقت کامل داشته باشید. 92 | * اگر با نرم‌افزار Postman آشنا هستید، می‌توانید برای تست فراخوانی APIهای اصلی نوبیتکس، از 93 | کالکشن Postman نوبیتکس 94 | استفاده کنید. لازم به توضیح است که این کالکشن تنها شامل برخی از APIهای نوبیتکس و کاربرد آن‌ها است و مرجع اصلی مستندات، همین صفحه است. 95 | 96 | همین طور می‌توانید بنا به نیاز خود این موارد را نیز در ادامه در نظر بگیرید: 97 | 98 | * در صورت تمایل به دریافت دوره‌ای و خودکار توکن، می‌توانید از 99 | API ورود - دریافت توکن 100 | استفاده نمایید. 101 | -------------------------------------------------------------------------------- /source/includes/_other.md: -------------------------------------------------------------------------------- 1 |

سایر

2 | 3 |

تنظیمات سیستم

4 | 5 | ```shell 6 | curl 'https://api.nobitex.ir/v2/options' 7 | ``` 8 | 9 | ```plaintext 10 | http GET https://api.nobitex.ir/v2/options 11 | ``` 12 | 13 | > ساختار کلی پاسخ به صورت زیر خواهد بود. کلیدهای موجود در هر بخش در مستندات توضیح داده شده‌اند. 14 | 15 | ```json 16 | { 17 | "status": "ok", 18 | "features": { 19 | "fcmEnabled": true, 20 | "chat": "livechat", 21 | "walletsToNet": false, 22 | "autoKYC": true, 23 | "enabledFeatures": [ 24 | "PriceAlert", 25 | "StopLoss", 26 | "GiftCard", 27 | "OCO" 28 | ], 29 | "betaFeatures": [] 30 | }, 31 | "coins": [ 32 | { 33 | "coin": "rls", 34 | "name": "Rial", 35 | "defaultNetwork": "FIAT_MONEY", 36 | "displayPrecision": "10", 37 | "networkList": { 38 | "FIATMONEY": { 39 | "addressRegex": "", 40 | "coin": "rls", 41 | "depositEnable": true, 42 | "isDefault": true, 43 | "minConfirm": 0, 44 | "name": "FIAT", 45 | "network": "FIAT_MONEY", 46 | "withdrawEnable": true, 47 | "withdrawFee": "4_000_0.00000000", 48 | "withdrawIntegerMultiple": "0.10000000", 49 | "withdrawMax": "500_000_000_0.00000000", 50 | "withdrawMin": "15_000_0.00000000" 51 | } 52 | }, 53 | "stdName": "﷼" 54 | }, 55 | ... Other Coins Options 56 | ], 57 | "nobitex": { 58 | "allCurrencies": [ 59 | "rls", 60 | "btc", 61 | ... Other currencies 62 | ], 63 | "activeCurrencies": [ 64 | "rls", 65 | "btc", 66 | "eth", 67 | "ltc", 68 | ... Other active currencies 69 | ], 70 | "xchangeCurrencies": [], 71 | "topCurrencies": [ 72 | "btc", 73 | "eth", 74 | "usdt", 75 | "doge", 76 | "shib", 77 | "trx", 78 | "ada", 79 | "ltc", 80 | "xrp" 81 | ], 82 | "testingCurrencies": [ 83 | "hbar" 84 | ], 85 | "withdrawLimits": { 86 | "normal": { 87 | "dailyCoin": "0", 88 | "dailyRial": "0", 89 | "dailySummation": "0", 90 | "monthlySummation": "0" 91 | }, 92 | "level0": { 93 | "dailyCoin": "0", 94 | "dailyRial": "0", 95 | "dailySummation": "0", 96 | "monthlySummation": "0" 97 | }, 98 | "44": { 99 | "dailyCoin": "1000000000", 100 | "dailyRial": "200000000", 101 | "dailySummation": "1000000000", 102 | "monthlySummation": "15000000000" 103 | }, 104 | ... Other withdraw options 105 | }, 106 | "minOrders": { 107 | "rls": "3000000", 108 | "usdt": "11", 109 | "2": "3000000", 110 | "13": "11" 111 | }, 112 | "amountPrecisions": { 113 | "BTCIRT": "0.000001", 114 | "BTCUSDT": "0.000001", 115 | "ETHIRT": "0.00001", 116 | ... Other amount precisions 117 | }, 118 | "pricePrecisions": { 119 | "BTCIRT": "10", 120 | "BTCUSDT": "0.01", 121 | "ETHIRT": "10", 122 | ... Other market precisions 123 | }, 124 | "giftCard": { 125 | "physicalFee": "360000" 126 | } 127 | } 128 | } 129 | ``` 130 | 131 | عملکرد سیستم نوبیتکس بر اساس پارامترهای مختلف تنظیم می‌شود که با استفاده از API «تنظیمات سیستم» می‌توانید مقادیر این پارامترها را دریافت نمایید. مواردی مانند رمزارزهای فعال، حداقل معامله در هر بازار، پله‌های کارمزد، سقف برداشت و بسیاری اطلاعات مفید دیگر از این طریق در دسترس شما قرار خواهد داشت. پاسخ در دو کلید `nobitex` شامل تنظیمات کلی سیستمی، و کلید `coins` شامل تنظیمات مخصوص هر رمزارز بازگردانده می‌شود. همچنین هر رمزارز دارای چندین «شبکه» است که برخی تنظیمات ممکن است فقط در سطح شبکه تعریف شوند یا در سطح رمزارز به صورت عمومی وجود داشته باشند ولی در بعضی شبکه‌های آن رمزارز متفاوت بوده و بازتعریف شوند. 132 | 133 | - **درخواست:** `GET /v2/options` 134 | - **نیاز به ارسال توکن:** ندارد 135 | - **پارامتر ورودی:** ندارد 136 | 137 | 140 | 141 | 142 | ### پارامترهای پاسخ - features 143 | 144 | کلید | نوع | توضیحات 145 | ---- |-------------| ---- 146 | fcmEnabled | bool | وضعیت فعال بودن FCM 147 | autoKYC | bool | وضعیت فعال بودن احراز خودکار 148 | enabledFeatures | list of str | لیست Featureهای فعال 149 | betaFeatures | list of str | لیست featureهای بتا 150 | 151 | 152 | ### پارامترهای پاسخ - nobitex 153 | 154 | کلید | نوع | توضیحات 155 | ---- |-------------| ---- 156 | allCurrencies | list of str | نماد تمام رمزارزهای موجود در بازارها 157 | activeCurrencies | list of str | نماد رمزارزهای اصلی و سطح یک 158 | xchangeCurrencies | list of str | نماد رمزارزهای صرافی 159 | topCurrencies | list of str | رمزارزهای برتر بازار 160 | testingCurrencies | list of str | رمزارزهای در حال توسعه و آزمایش 161 | withdrawLimits | dict | محدودیت های روزانه و ماهانه در سطوح مختلف 162 | minOrders | dict | حداقل مبلغ سفارش ریالی و تتری 163 | amountPrecisions | dict | دقت اعشار مقدار در بازارهای مختلف 164 | pricePrecisions | dict | دقت اعشار قیمت در بازارهای مختلف 165 | giftCard | dict | هزینه چاپ گیفت کارتهای فیزیکی 166 | 167 | 168 | ### پارامترهای پاسخ - Coins 169 | 170 | فیلد | نوع | توضیحات | نمونه 171 | ---- |--------------------------------------------------------------------------------------------------------| ---- | ---- 172 | coin | str | نماد یکتای رمزارز، معمولاً با حروف کوچک | `rls` یا `btc` یا `eth` یا … 173 | name | str | نام انگلیسی رمزارز | `Bitcoin` یا `TRON` یا `Dogecoin` یا … 174 | default_network | str | شبکه پیش‌فرض رمزارز، یکی از کلیدهای NetworkOptions آن رمزارز | `FIAT_MONEY` یا `BTC` یا `BSC` یا … 175 | network_list | dict | یک دیکشنری از شبکه‌های مختلف این رمزارز، با کلیدهای نام انگلیسی هر شبکه و مقادیر از نوع NetworkOptions | 176 | displayPrecision | str | دقت اعشار پیش‌فرض نمایش مقادیر این رمزارز | `0.0001` یا `0.1` یا `1` 177 | stdName | str | عنوان رمز ارز | `ریال` 178 | 179 | 180 | ### پارامترهای پاسخ - Network 181 | 182 | فیلد | نوع | توضیحات | نمونه 183 | ---- | ---- | ---- | ---- 184 | network | str | نماد یکتای شبکه، معمولاً با حروف بزرگ | `FIAT_MONEY` یا `BTC` یا `BSC` یا … 185 | name | str | نام انگلیسی خوانای شبکه | `BTC` یا `ERC20` یا … 186 | isDefault | boolean | آیا این شبکه پیش‌فرض برای این رمزارز در نوبیتکس است؟ | `false` 187 | beta | boolean | آیا این شبکه هنوز در حالت آزمایشی است؟ | `false` 188 | addressRegex | str | الگوی آدرس‌ها در این شبکه | `^0x[0-9A-Fa-f]{40}$` 189 | memoRequired | boolean | آیا تراکنش روی این شبکه نیازمند ممو است؟ | `false` 190 | memoRegex | str | در صورت وجود، ممو باید چه الگویی داشته باشد؟ | `^[0-9A-Za-z]{1,28}$` 191 | depositEnable | boolean | آیا واریز رمزارز روی این شبکه فعال است؟ | `true` 192 | minConfirm | int | حداقل تعداد کانفیرم شبکه برای تایید اولیه واریز | `1` 193 | depositInfo | dict | فهرست پارامترهای واریز | `{"standard": {"depositMin": "0.01"}}` 194 | depositInfo.standard.depositMin | monetary | حداقل مقدار واریز این رمزارز روی شبکه | `0` 195 | depositInfo.standard.depositMax | monetary | حداکثر مقدار واریز این رمزارز روی شبکه | `1000` 196 | withdrawEnable | boolean | آیا برداشت رمزارز روی این شبکه فعال است؟ | `false` 197 | withdrawIntegerMultiple | monetary | حداقل مقدار تغییر مقدار قابل برداشت | `0.000001` 198 | withdrawFee | monetary | کارمزد برداشت | `0.1` 199 | withdrawMin | monetary | حداقل مقدار قابل برداشت | `0.1` 200 | withdrawMax | monetary | حداکثر مقدار قابل برداشت | `1000` 201 | -------------------------------------------------------------------------------- /source/includes/_portfolio.md: -------------------------------------------------------------------------------- 1 |

سود و زیان

2 | 3 | «پرتفو» یا «پنل سود و زیان» کاربر، گزارشی است که با توجه به معاملات یا افزایش و کاهش قیمت رمزارزها در مارکت میزان سود یا ضرر بدست آمده و درصدهای آنها را نسبت به قیمت خریداری شده (موجودی) نمایش میدهد. 4 | 5 | در حال حاضر این اطلاعات در پرتفو هر کاربر ارائه می‌شود: 6 | 7 | * سود و زیان روزانه هفته گذشته 8 | * سود زیان کل به صورت روزانه در هفته گذشته 9 | * سود و زیان کل ماه گذشته 10 | 11 | 12 | 13 | 14 |

سود و زیان روزانه هفته گذشته

15 | 16 | ```shell 17 | curl -X POST 'https://api.nobitex.ir/users/portfolio/last-week-daily-profit' \ 18 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 19 | ``` 20 | 21 | ```plaintext 22 | http POST https://api.nobitex.ir/users/portfolio/last-week-daily-profit \ 23 | Authorization: Token yourTOKENhereHEX0000000000 24 | ``` 25 | 26 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 27 | 28 | ```json 29 | { 30 | "status": "ok", 31 | "data": [ 32 | { 33 | "report_date": "2021-06-30", 34 | "total_profit": 0, 35 | "total_profit_percentage": 0, 36 | "total_balance": 0 37 | }, 38 | { 39 | "report_date": "2021-07-01", 40 | "total_profit": 0, 41 | "total_profit_percentage": 0, 42 | "total_balance": 0 43 | }, 44 | { 45 | "report_date": "2021-07-02", 46 | "total_profit": 0, 47 | "total_profit_percentage": 0, 48 | "total_balance": 0 49 | }, 50 | { 51 | "report_date": "2021-07-03", 52 | "total_profit": 0, 53 | "total_profit_percentage": 0, 54 | "total_balance": 0 55 | }, 56 | { 57 | "report_date": "2021-07-04", 58 | "total_profit": 0, 59 | "total_profit_percentage": 0, 60 | "total_balance": 0 61 | }, 62 | { 63 | "report_date": "2021-07-05", 64 | "total_profit": "0E-10", 65 | "total_profit_percentage": "0E-10", 66 | "total_balance": "4516559.9205900000" 67 | }, 68 | { 69 | "report_date": "2021-07-06", 70 | "total_profit": "152570.1426800000", 71 | "total_profit_percentage": "3.3780165737", 72 | "total_balance": "4669130.0632700000" 73 | } 74 | ] 75 | } 76 | ``` 77 | 78 | > در صورتی که این ویژگی برای کاربر فعال نباشد با این جواب روبرو خواهند شد 79 | 80 | ```json 81 | { 82 | "status": "failed", 83 | "code": "PortfolioDisabled", 84 | "message": "Portfolio feature is not available for your user." 85 | } 86 | ``` 87 | 88 | > در صورتی که اطلاعاتی از سود و زیان کاربر وجود نداشته باشد 89 | 90 | ```json 91 | { 92 | "status": "failed", 93 | "code": "LastWeekDailyProfitFail", 94 | "message": "اطلاعاتی جهت نمایش وجود ندارد" 95 | } 96 | ``` 97 | 98 | برای دریافت اطلاعات سود و زیان روزانه هفته گذشته از این درخواست استفاده نمایید: 99 | 100 | * **درخواست:** `POST users/portfolio/last-week-daily-profit` 101 | * **محدودیت فراخوانی:** 10 درخواست در 3 دقیقه 102 | 103 | ### نکات و ملاحظات: 104 | این API به صورت پیش فرض اطلاعات 7 روز گذشته را ارائه می دهد. برای دریافت اطلاعات ماهانه یا ۳۰ روز گذشته کافیست پارامتر monthly با مقدار true را به همراه این درخواست ارسال نمایید. 105 | 106 |

سود زیان کل به صورت روزانه در هفته گذشته

107 | 108 | ```shell 109 | curl -X POST 'https://api.nobitex.ir/users/portfolio/last-week-daily-total-profit' \ 110 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 111 | ``` 112 | 113 | ```plaintext 114 | http POST https://api.nobitex.ir/users/portfolio/last-week-daily-total-profit \ 115 | Authorization: Token yourTOKENhereHEX0000000000 116 | ``` 117 | 118 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 119 | 120 | ```json 121 | { 122 | "status": "ok", 123 | "data": [ 124 | { 125 | "report_date": "2021-06-27", 126 | "total_profit": 0, 127 | "total_profit_percentage": 0 128 | }, 129 | { 130 | "report_date": "2021-06-28", 131 | "total_profit": 0, 132 | "total_profit_percentage": 0 133 | }, 134 | { 135 | "report_date": "2021-06-29", 136 | "total_profit": "4507274.2415300000", 137 | "total_profit_percentage": "197.3669039200" 138 | }, 139 | { 140 | "report_date": "2021-06-30", 141 | "total_profit": "9020935.7092505000", 142 | "total_profit_percentage": "-307.6135237294" 143 | }, 144 | { 145 | "report_date": "2021-07-01", 146 | "total_profit": "-5373087.9340195000", 147 | "total_profit_percentage": "1302.7642741973" 148 | }, 149 | { 150 | "report_date": "2021-07-02", 151 | "total_profit": "313580813.4306171358", 152 | "total_profit_percentage": "-899.0991999052" 153 | }, 154 | { 155 | "report_date": "2021-07-03", 156 | "total_profit": "313580813.4306171358", 157 | "total_profit_percentage": "-899.0991999052" 158 | } 159 | ] 160 | } 161 | ``` 162 | 163 | > در صورتی که این ویژگی برای کاربر فعال نباشد با این جواب روبرو خواهند شد 164 | 165 | ```json 166 | { 167 | "status": "failed", 168 | "code": "PortfolioDisabled", 169 | "message": "Portfolio feature is not available for your user." 170 | } 171 | ``` 172 | 173 | > در صورتی که اطلاعاتی از سود و زیان کاربر وجود نداشته باشد 174 | 175 | ```json 176 | { 177 | "status": "failed", 178 | "code": "LastWeekDailyProfitFail", 179 | "message": "اطلاعاتی جهت نمایش وجود ندارد" 180 | } 181 | ``` 182 | 183 | برای دریافت اطلاعات سود و زیان روزانه هفته گذشته از این درخواست استفاده نمایید: 184 | 185 | * **درخواست:** `POST users/portfolio/last-week-daily-total-profit` 186 | * **محدودیت فراخوانی:** 10 درخواست در 3 دقیقه 187 | 188 | 189 | 190 |

سود و زیان کل ماه گذشته

191 | 192 | ```shell 193 | curl -X POST 'https://api.nobitex.ir/users/portfolio/last-month-total-profit' \ 194 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 195 | ``` 196 | 197 | ```plaintext 198 | http POST https://api.nobitex.ir/users/portfolio/last-month-total-profit \ 199 | Authorization: Token yourTOKENhereHEX0000000000 200 | ``` 201 | 202 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 203 | 204 | ```json 205 | { 206 | "status": "ok", 207 | "data": { 208 | "total_profit": "8987787000.0000000000", 209 | "total_profit_percentage": "83.60700983438201160181729556" 210 | } 211 | } 212 | ``` 213 | 214 | > در صورتی که این ویژگی برای کاربر فعال نباشد با این جواب روبرو خواهند شد 215 | 216 | ```json 217 | { 218 | "status": "failed", 219 | "code": "PortfolioDisabled", 220 | "message": "Portfolio feature is not available for your user." 221 | } 222 | ``` 223 | 224 | > در صورتی که اطلاعاتی از سود و زیان کاربر وجود نداشته باشد 225 | 226 | ```json 227 | { 228 | "status": "failed", 229 | "code": "LastWeekDailyProfitFail", 230 | "message": "اطلاعاتی جهت نمایش وجود ندارد" 231 | } 232 | ``` 233 | 234 | برای دریافت اطلاعات سود و زیان روزانه هفته گذشته از این درخواست استفاده نمایید: 235 | 236 | * **درخواست:** `POST users/portfolio/last-month-total-profit` 237 | * **محدودیت فراخوانی:** 10 درخواست در 3 دقیقه 238 | 239 | 240 | 241 | -------------------------------------------------------------------------------- /source/includes/_referral.md: -------------------------------------------------------------------------------- 1 | # طرح معرفی دوستان 2 | 3 | نوبیتکس طرحی به نام معرفی دوستان در نظر گرفته است که از طریق آن هم به گسترش نوبیتکس کمک می‌کنید و هم از مزایای آن بهره‌مند می‌شوید. براساس این طرح شما می‌توانید دوستان خود را با لینک اختصاصی خود به نوبیتکس دعوت کنید و درصدی از کارمزد معاملات آن‌ها را به عنوان پاداش دریافت نمایید. برای اطلاعات بیشتر به [صفحه قوانین طرح معرفی دوستان](https://nobitex.ir/policies/referral/) مراجعه کنید. 4 | 5 | معرفی دوستان با استفاده از ایجاد «کد دعوت» انجام می‌شود. هر کاربر نوبیتکس می‌تواند برای خود یک یا چند کد دعوت بسازد. کدهای دعوت معمولاً شامل شش رقم هستند ولی می‌توانند طول متفاوتی داشته باشند یا حتی رشته‌های دلخواه باشند. در زمان ساخت هر کد دعوت می‌توان سهم کاربر معرف و کاربر دعوت شده از کارمزد اهدایی را مشخص نمود. 6 | 7 | با استفاده از «فهرست کدهای دعوت» می‌توانید فهرستی از کدهای دعوت فعلی خود را دریافت نمایید. به همراه این فهرست، میزان سود شما و برخی دیگر از آمار مربوط به کاربران ثبت‌نامی با آن کد دعوت ارسال می‌شود. اگر هنوز کد دعوتی ندارید، برای شروع استفاده از طرح معرفی دوستان می‌توانید با استفاده از «ایجاد کد دعوت»، یک کد دعوت بسازید. 8 | 9 | 13 | 14 | 15 | ## فهرست کدهای دعوت 16 | 17 | ```shell 18 | curl -X GET 'https://api.nobitex.ir/users/referral/links-list' \ 19 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 20 | ``` 21 | 22 | ```plaintext 23 | http --follow --timeout 3600 GET https://api.nobitex.ir/users/referral/links-list \ 24 | Authorization:'Token yourTOKENhereHEX0000000000' 25 | ``` 26 | 27 | * **درخواست:** `POST /users/referral/links-list` 28 | * **محدودیت فراخوانی:** ۵۰ درخواست در هر ۱۰ دقیقه 29 | 30 | ### پارامترهای پاسخ 31 | پارامتر | نوع | توضیحات | نمونه 32 | ---- | ---- | ---- | ---- 33 | links | list of ReferralLink | فهرست کدهای دعوت این کاربر | `[{...ReferralLink...}, ...]` 34 | 35 | ### شی ReferralLink 36 | فیلد | نوع | توضیحات | نمونه 37 | ---- | ---- | ---- | ---- 38 | id | int | شناسه یکتای لینک | `1001` 39 | referralCode | string | کد دعوت | `40404` 40 | createdAt | datetime | تاریخ ایجاد کد | `2020-07-15T11:32:38.326809+00:00` 41 | userShare | int | سهم کاربر معرف از کارمزد معاملات کاربر دعوت شده | `20` 42 | friendShare | int | سهم کاربر دعوت شده از کارمزد معاملات خود | `10` 43 | description | string | توضیحات اختیاری کاربر برای این کد | `Shared on Instagram page X` 44 | statsRegisters | int | آمار: کاربران ثبت‌نام کرده با این کد | `20` 45 | statsTrades | int | آمار: مجموع تعداد معاملات کاربران ثبت‌نام کرده با این کد | `240` 46 | statsProfit | monetary: IRR | آمار: مجموع ریالی درآمد کاربر از این کد دعوت | `3200000` 47 | 48 | 49 | ## ایجاد کد دعوت 50 | 51 | ```shell 52 | curl -X GET 'https://api.nobitex.ir/users/get-referral-code' \ 53 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 54 | ``` 55 | 56 | ```plaintext 57 | http --follow --timeout 3600 GET https://api.nobitex.ir/users/get-referral-code \ 58 | Authorization:'Token yourTOKENhereHEX0000000000' 59 | ``` 60 | برای ایجاد یک کد دعوت جدید برای کاربر، از «ایجاد کد دعوت» استفاده نمایید. 61 | 62 | * **درخواست:** `POST /users/referral/links-add` 63 | * **محدودیت فراخوانی:** ۵ درخواست در هر دقیقه 64 | 65 | ### پارامترهای ورودی 66 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 67 | ------- | ---- | --------- | --------- | ----- 68 | friendShare | int | `0` | سهم کارمزد اهدایی به دوست دعوت شده با این کد | `10` 69 | 70 | ### حالت‌های خطا 71 | کد خطا | توضیحات 72 | ---- | ---- 73 | InvalidGivebackShare | سهم کارمزد دوست قابل قبول نیست. پارامتر friendShare را بررسی کنید. 74 | TooManyReferralLinks | سهمیه ۳۰ تایی کدهای دعوت قابل ساخت برای هر کاربر به پایان رسیده است. 75 | ReferralCodeUnavailable | امکان ایجاد کد دعوت در حال حاضر وجود ندارد. 76 | ReferralCodeExists | خطایی در ثبت کد دعوت رخ داده است. 77 | 78 | 79 | ## وضعیت دعوت کاربر 80 | 81 | 82 | ```shell 83 | curl -X GET 'https://api.nobitex.ir/users/referral/referral-status' \ 84 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 85 | ``` 86 | 87 | ```plaintext 88 | http --follow --timeout 3600 GET https://api.nobitex.ir/users/referral/referral-status \ 89 | Authorization:'Token yourTOKENhereHEX0000000000' 90 | ``` 91 | 92 | برای اطلاع از این که کاربر فعلی توسط کاربر دیگری به نوبیتکس دعوت شده است یا خیر، از «وضعیت دعوت کاربر» استفاده نمایید. 93 | 94 | * **درخواست:** `POST /users/referral/referral-status` 95 | * **محدودیت فراخوانی:** ۵۰ درخواست در هر ۱۰ دقیقه 96 | 97 | ### پارامترهای پاسخ 98 | پارامتر | نوع | توضیحات | نمونه 99 | ---- | ---- | ---- | ---- 100 | hasReferrer | boolean | آیا کاربر توسط کاربر دیگری دعوت شده است؟ | `true` 101 | 102 | 103 | ## ثبت معرف کاربر 104 | 105 | ```shell 106 | curl -X GET 'https://api.nobitex.ir/users/referral/set-referrer' \ 107 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 108 | ``` 109 | 110 | ```plaintext 111 | http --follow --timeout 3600 GET https://api.nobitex.ir/users/referral/set-referrer \ 112 | Authorization:'Token yourTOKENhereHEX0000000000' 113 | ``` 114 | 115 | کد دعوت باید در زمان ثبت‌نام توسط کاربر وارد شده یا با استفاده از پیوند دعوت به صورت خودکار پر شود. با این حال تا ۲۴ ساعت 116 | پس از ثبت‌نام نیز امکان ثبت معرف توسط کاربر با استفاده از این API وجود دارد. منظور از کاربر معرف، کاربری است که کاربر فعلی 117 | را دعوت نموده است. 118 | 119 | * **درخواست:** `POST /users/referral/set-referrer` 120 | * **محدودیت فراخوانی:** ۵۰ درخواست در هر ۱۰ دقیقه 121 | 122 | ### پارامترهای ورودی 123 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 124 | ------- | ---- | --------- | --------- | ----- 125 | referrerCode | string | الزامی | کد دعوت کاربر دعوت کننده | `40404` 126 | 127 | ### حالت‌های خطا 128 | کد خطا | توضیحات 129 | ---- | ---- 130 | ReferrerChangeUnavailable | بیش از ۲۴ ساعت از ثبت‌نام کاربر گذشته است و تعریف معرف دیگر ممکن نیست. 131 | -------------------------------------------------------------------------------- /source/includes/_security.md: -------------------------------------------------------------------------------- 1 | # امنیت 2 | 3 | ## سابقه ورود 4 | 5 | ```shell 6 | curl 'https://api.nobitex.ir/users/login-attempts' \ 7 | -H "Authorization: Token yourTOKENhereHEX0000000000" 8 | ``` 9 | 10 | ```plaintext 11 | http POST https://api.nobitex.ir/users/login-attempts \ 12 | ``` 13 | 14 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 15 | 16 | ```json 17 | { 18 | "status": "ok", 19 | "attempts": [ 20 | { 21 | "ip": "46.209.130.106", 22 | "username": "name@example.com", 23 | "status": "Successful", 24 | "createdAt": "2018-11-28T14:16:08.264308+00:00" 25 | }, 26 | ... 27 | ] 28 | } 29 | ``` 30 | 31 | برای دریافت سابقه ورود از این نوع درخواست استفاده نمایید: 32 | 33 | - **درخواست:** `GET /users/login-attempts` 34 | 35 | 36 | ## فعالسازی لغو اضطراری 37 | 38 | ```shell 39 | curl 'https://api.nobitex.ir/security/emergency-cancel/activate' \ 40 | -X GET \ 41 | -H "Authorization: Token yourTOKENhereHEX0000000000" 42 | ``` 43 | 44 | ```plaintext 45 | http GET https://api.nobitex.ir/security/emergency-cancel/activate \ 46 | Authorization: Token yourTOKENhereHEX0000000000 47 | ``` 48 | 49 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 50 | 51 | ```json 52 | { 53 | "status": "ok", 54 | "cancelCode": { 55 | "code": "seJlef35L3" 56 | } 57 | } 58 | ``` 59 | 60 | 61 | جهت فعالسازی امکان لغو اضطراریِ درخواست های برداشت از این درخواست استفاده نمائید. 62 | پس از فعالسازی این امکان، پیامک و ایمیل ارسالی پس از ثبت درخواست برداشت، 63 | حاوی لینکی خواهد بود که شما میتوانید با استفاده از آن در صورتی که درخواست برداشت توسط شما ثبت نشده است، در کمترین زمان ممکن و بدون نیاز به لاگین، درخواست های برداشت خود را لغو نمایید. 64 | 65 | - **درخواست:** `GET /security/emergency-cancel/activate` 66 | 67 | 68 | ### نکات و ملاحظات 69 | توجه داشته باشید: در صورتی که درخواست برداشت شما توسط این امکان لغو گردد، امکان ثبت درخواست برداشت تا ۷۲ ساعت برای شما غیرفعال خواهد شد. 70 | 71 | 72 | 73 | ## آنتی فیشینگ 74 | 75 | جهت امنیت حساب کاربری و همچنین اعتماد بیشتر کاربران به ایمیل هایی که از سمت توبیتکس ارسال میشود نیاز هست که کاربر بتواند کد یونیک برای حساب کاربری خود انتخاب کند که تمامی ایمیل هایی که از سمت نوبیتکس به صورت اتوماتیک ارسال میشود حاوی این کد باشد. 76 | .این کد به کاربر این اطمینان را میدهد که این ایمیل قطعا از نوبیتکس ارسال شده است. 77 | 78 | 79 | ### ایجاد کد آنتی فیشینگ 80 | 81 | >نمونه درخواست: 82 | 83 | ```shell 84 | curl --location --request POST 'https://api.nobitex.ir/security/anti-phishing' \ 85 | --header 'Authorization: Token yourTOKENhereHEX0000000000' \ 86 | --form 'code="sample_anti_phishing"' \ 87 | --form 'otpCode="123456"' 88 | ``` 89 | 90 | 91 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 92 | 93 | ```json 94 | { 95 | "status": "ok" 96 | } 97 | ``` 98 | 99 | > برای دریافت رمزیکبارمصرف otpCode باید از API زیر با پارامترهای مشخص شده استفاده نمایید: 100 | 101 | ```shell 102 | curl --location --request GET 'https://api.nobitex.ir/otp/request?type=email&usage=anti_phishing_code' \ 103 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 104 | ``` 105 | 106 | > **حالت های خطا** 107 | 108 | > در صورتی که پارامتر کدیکبارمصرف یا آنتی فیشینگ را ارسال نکرده باشید با این خطا روبرو خواهید شد. 109 | 110 | ```json 111 | { 112 | "status": "failed", 113 | "code": "ParseError", 114 | "message": "Missing string value" 115 | } 116 | ``` 117 | 118 | 119 | > در صورتی که کدیکبار مصرف ارسال شده، نامعتبر باشد با این خطا روبرو خواهید بود. 120 | 121 | ```json 122 | { 123 | "status": "failed", 124 | "code": "InvalidOTPCode", 125 | "message": "Please use otp/request endpoint" 126 | } 127 | ``` 128 | 129 | > در صورتی که طول عبارت ارسالی نامناسب باشد با این خطا مواجه خواهید شد 130 | 131 | ```json 132 | { 133 | "status": "failed", 134 | "code": "InvalidCodeLength", 135 | "message": "Code length must be between 4 and 15 characters" 136 | } 137 | ``` 138 | 139 | 140 | * **درخواست:** `POST /security/anti-phishing` 141 | * **محدودیت فراخوانی:** ۱۰ درخواست در هر دقیقه 142 | 143 | 144 | * پارامترهای ورودی 145 | 146 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 147 | ------- |--------|---------|----------------------------------------------| --------- 148 | code | string | الزامی | کد آنتی فیشینگ تعیین شده توسط کاربر | sample_anti_phishing 149 | otpCode | number | الزامی | کد یکبار مصرف ارسال شده به شماره همراه کاربر | 12345 150 | 151 | 152 | 153 | 154 | ### دریافت کد آنتی فیشینگ 155 | 156 | * **درخواست:** `GET /security/anti-phishing` 157 | * **محدودیت فراخوانی:** ۱۰ درخواست در هر دقیقه 158 | 159 | 160 | >نمونه درخواست: 161 | 162 | ```shell 163 | curl --location --request GET 'https://api.nobitex.ir/security/anti-phishing' \ 164 | --header 'Authorization: Token yourTOKENhereHEX0000000000' 165 | ``` 166 | 167 | 168 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 169 | 170 | ```json 171 | { 172 | "status": "ok", 173 | "antiPhishingCode": "s*********g" 174 | } 175 | ``` 176 | 177 | > در صورتی که آنتی‌فیشینگ کد برای کاربر فعال نشده باشد با این پاسخ مواجه خواهید شد 178 | 179 | ```json 180 | { 181 | "status": "failed", 182 | "code": "NotFound", 183 | "message": "AntiPhishingCode is not declared for this user" 184 | } 185 | ``` 186 | -------------------------------------------------------------------------------- /source/includes/_symbols.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | 12 | 13 | 16 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /source/includes/internal/_2fa.md: -------------------------------------------------------------------------------- 1 | # شناسایی دوعاملی 2 | شناسایی دوعاملی جهت افزایش امنیت حساب و دارایی کاربر در زمان ورود، علاوه بر گذرواژه، یک کد شش رقمی تقاضا خواهد نمود که از [احرازگر گوگل](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2 "Google Authenticator") دریافت می‌شود. 3 | 4 | ### نکات و ملاحظات 5 | 6 | 1. فعالسازی شناسایی دو عاملی برای کاربران سطح دو نوبیتکس اجباری است. 7 | 2. احراز هویت در API های این مجموعه الزامی است. 8 | 9 | ##فعال‌سازی شناسایی دوعاملی 10 | 11 | >نمونه درخواست: 12 | 13 | ```shell 14 | curl 'https://api.nobitex.ir/users/tfa/request' \ 15 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 16 | ``` 17 | 18 | ```javascript 19 | api.get('/users/tfa/request', { 20 | headers: {Authorization: "Token yourTOKENhereHEX0000000000"}, 21 | }).then((response) => { 22 | console.log(response); 23 | }); 24 | ``` 25 | 26 | ```java 27 | public interface APIService { 28 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 29 | @GET("/users/tfa/request") 30 | Call request2FA(); 31 | } 32 | 33 | APIService api = retrofit.create(APIService.class); 34 | 35 | Call call = api.request2FA(); 36 | ``` 37 | 38 | ```plaintext 39 | GET /users/tfa/request HTTP/1.1 40 | Host: api.nobitex.ir 41 | Authorization: Token yourTOKENhereHEX0000000000 42 | ``` 43 | 44 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 45 | 46 | ```json 47 | { 48 | "status": "ok", 49 | "device": { 50 | "id": 1, 51 | "name": "App", 52 | "confirmed": false, 53 | "configUrl": "otpauth://totp/Nobitex%3Atest%40nobitex.net?secret=FXZJ28P2V3U0F4W3U7707EYIKNBJAKR6&algorithm=SHA1&digits=6&period=30&issuer=Nobitex" 54 | } 55 | } 56 | ``` 57 | 58 | برای فعال‌سازی شناسایی دوعاملی از این نوع درخواست استفاده نمایید: 59 | 60 | پس از ثبت درخواست، پیامکی حاوی کد شش رقمی جهت تایید دستگاه به شماره همراه کاربر ارسال می‌شود که ظرف مدت 30 دقیقه منقضی خواهد شد. 61 | 62 | - **درخواست:** `GET /users/tfa/request` 63 | - **محدودیت فراخوانی:** 3 درخواست در 10 دقیقه / 10 درخواست در ساعت 64 | 65 | 66 | 69 | 70 | ### پارامترهای پاسخ 71 | 72 | پارامتر | نوع | توضیحات | نمونه 73 | ------- | ---- | --------- | --------- 74 | status | string | وضعیت پاسخ | ok 75 | device | TOTPDevice | اطلاعات تنظیم دستگاه | {"id": 1, ...} 76 | 77 | ### شی TOTPDevice 78 | 79 | پارامتر | نوع | توضیحات | نمونه 80 | ------- | ---- | --------- | --------- 81 | id | integer | شناسه دستگاه | 1 82 | name | string | نام دستگاه | "App" 83 | confirmed | boolean | تایید شده با پیامک | false 84 | configUrl | string | آدرس تنظیم شناسایی دوعاملی در احرازگر گوگل | "otpauth://totp/Nobitex%3Atest%40nobitex.net?secret=FXZJ28P2V3U0F4W3U7707EYIKNBJAKR6&algorithm=SHA1&digits=6&period=30&issuer=Nobitex" 85 | 86 | 87 | 88 | ### حالت‌های خطا 89 | 90 | کد خطا | توضیحات 91 | ---- | ---- 92 | UnverifiedMobile | کاربر شماره تماس یا ایمیل تایید شده ندارد. 93 | IPRestricted |‌ فراخوانی فقط از داخل ایران امکان‌پذیر است. 94 | 95 | 96 | ### نکات و ملاحظات 97 | توجه فرمایید که فراخوانی این درخواست فقط از داخل ایران امکان‌پذیر است 98 | 99 | کاربر با خروجی این API می‌تواند برنامه احرازگر گوگل را فعال نماید. این برنامه هر 30 ثانیه یک بار کد جدیدی تولید می‌کند که تا دو دقیقه قابل استفاده است. 100 | در صورت تنظیم درست احرازگر گوگل می‌توانید برای تایید دستگاه (device) و تکمیل درخواست خود اقدام کنید. 101 | 102 | 103 | ##تایید شناسایی دوعاملی 104 | 105 | >نمونه درخواست: 106 | 107 | ```shell 108 | curl -X POST 'https://api.nobitex.ir/users/tfa/confirm' \ 109 | -H 'Authorization: Token yourTOKENhereHEX0000000000' \ 110 | -H 'Content-Type: application/json' \ 111 | --data '{"device": 1, "otp": 123456, "sms_otp": 987654}' 112 | ``` 113 | 114 | ```javascript 115 | api.post('/users/tfa/confirm', {device: 1, otp: 123456, sms_otp: 987654}, { 116 | headers: {Authorization: "Token yourTOKENhereHEX0000000000"}, 117 | }).then((response) => { 118 | console.log(response); 119 | }); 120 | ``` 121 | 122 | ```java 123 | public interface APIService { 124 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 125 | @FormUrlEncoded 126 | @POST("/users/tfa/confirm") 127 | Call confirm2FA(@Field("device") int deviceId, @Field("otp") int otp, @Field("sms_otp") int smsOtp); 128 | } 129 | 130 | APIService api = retrofit.create(APIService.class); 131 | 132 | Call call = api.confirm2FA(1, 123456, 987654); 133 | ``` 134 | 135 | 136 | 137 | ```plaintext 138 | POST /users/tfa/confirm HTTP/1.1 139 | Host: api.nobitex.ir 140 | Authorization: Token yourTOKENhereHEX0000000000 141 | {"device": 1, "otp": 123456, "sms_otp": 987654} 142 | ``` 143 | 144 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 145 | 146 | ```json 147 | { 148 | "status": "ok" 149 | } 150 | ``` 151 | 152 | پس از تنظیم شناسایی دوعاملی در احرازگر گوگل و دریافت پیامک کد تایید، برای تکمیل درخواست خود از این نوع درخواست استفاده نمایید: 153 | 154 | - **درخواست:** `POST /users/tfa/confirm` 155 | - **محدودیت فراخوانی:** 10 درخواست در 10 دقیقه / 20 درخواست در ساعت 156 | 157 | ### پارامترهای ورودی 158 | 159 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 160 | ------- | ---- | ---- | --------- | --------- 161 | device | integer | الزامی | شناسه دستگاهی که فعال‌سازی شناسایی دوعاملی را درخواست کرده | 1 162 | otp | integer | الزامی | رمز یکبارمصرف شش رقمی دریافت شده از احرازگر گوگل | 123456 163 | sms_otp | integer | الزامی | کد تایید شش رقمی پیامک شده به شماره همراه کاربر | 987654 164 | 165 | ### پارامترهای پاسخ 166 | 167 | پارامتر | نوع | توضیحات | نمونه 168 | ------- | ---- | --------- | --------- 169 | status | string | وضعیت پاسخ | ok 170 | 171 | 172 | ### حالت‌های خطا 173 | 174 | کد خطا | توضیحات 175 | ---- | ---- 176 | InvalidOTP | رمز یکبارمصرف نامعتبر است یا زمان لازم برای انتظار پس از ورود اشتباه رمز سپری نشده است. 177 | MissingSmsOTP | کد تایید پیامک شده ارسال نشده است. 178 | InvalidSmsOTP | کد تایید پیامک شده منقضی یا نامعتبر است. 179 | 180 | 181 | ### نکات و ملاحظات 182 | 1. در صورت اشتباه وارد کردن رمز یکبارمصرف احرازگر گوگل، برای درخواست بعدی با توجه به دفعات اشتباه بایستی به ترتیب 1، 2، 4، 8 و ... ثانیه پیش از درخواست مجدد صبر کنید. 183 | 2. حداکثر یک دستگاه دارای شناسایی دوعاملی فعال در هر لحظه برای کاربر مجاز است و در صورت فعال‌سازی دستگاه دیگر، دستگاه قبلی غیر فعال خواهد شد. 184 | 185 | 186 | ##غیرفعال‌سازی شناسایی دوعاملی 187 | 188 | >نمونه درخواست: 189 | 190 | ```shell 191 | curl -X POST 'https://api.nobitex.ir/users/tfa/disable' \ 192 | -H 'Authorization: Token yourTOKENhereHEX0000000000' \ 193 | -H 'Content-Type: application/json' \ 194 | --data '{"otp": 123456}' 195 | ``` 196 | 197 | ```javascript 198 | api.post('/users/tfa/disable', {otp: 123456}, { 199 | headers: {Authorization: "Token yourTOKENhereHEX0000000000"}, 200 | }).then((response) => { 201 | console.log(response); 202 | }); 203 | ``` 204 | 205 | ```java 206 | public interface APIService { 207 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 208 | @FormUrlEncoded 209 | @POST("/users/tfa/disable") 210 | Call disable2FA(@Field("otp") int otp); 211 | } 212 | 213 | APIService api = retrofit.create(APIService.class); 214 | 215 | Call call = api.disable2FA(123456); 216 | ``` 217 | 218 | 219 | 220 | ```plaintext 221 | POST /users/tfa/disable HTTP/1.1 222 | Host: api.nobitex.ir 223 | Authorization: Token yourTOKENhereHEX0000000000 224 | {"otp": 123456} 225 | ``` 226 | 227 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 228 | 229 | ```json 230 | { 231 | "status": "ok" 232 | } 233 | ``` 234 | 235 | برای غیرفعال‌سازی شناسایی دوعاملی از این نوع درخواست استفاده نمایید: 236 | 237 | * **درخواست:** `POST /users/tfa/disable` 238 | 239 | * پارامترهای ورودی: 240 | 241 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 242 | ------- | ---- | ---- | --------- | --------- 243 | otp | integer | الزامی | رمز یکبارمصرف شش رقمی دریافت شده از احرازگر گوگل | 123456 244 | 245 | ### پارامترهای پاسخ 246 | 247 | پارامتر | نوع | توضیحات | نمونه 248 | ------- | ---- | --------- | --------- 249 | status | string | وضعیت پاسخ | ok 250 | 251 | 252 | ### حالت‌های خطا 253 | 254 | کد خطا | توضیحات 255 | ---- | ---- 256 | InvalidOTP | رمز یکبارمصرف نامعتبر است یا زمان لازم برای انتظار پس از ورود اشتباه رمز سپری نشده است. 257 | IPRestricted |‌ فراخوانی فقط از داخل ایران امکان‌پذیر است. 258 | 259 | ### نکات و ملاحظات 260 | 1. در صورت اشتباه وارد کردن رمز یکبارمصرف احرازگر گوگل، برای درخواست بعدی با توجه به دفعات اشتباه بایستی به ترتیب 1، 2، 4، 8 و ... ثانیه پیش از درخواست مجدد صبر کنید. 261 | 2. توجه فرمایید که فراخوانی این درخواست فقط از داخل ایران امکان‌پذیر است. 262 | -------------------------------------------------------------------------------- /source/includes/internal/_active_order_count.md: -------------------------------------------------------------------------------- 1 | # معامله در بازار 2 | 3 | ## تعداد سفارش‌های باز کاربر 4 | 5 | 6 | ```shell 7 | curl 'https://api.nobitex.ir/market/orders/open-count?tradeType=margin' \ 8 | -H "Authorization: Token yourTOKENhereHEX0000000000" 9 | ``` 10 | 11 | ```plaintext 12 | http GET https://api.nobitex.ir/market/orders/open-count?tradeType=margin 13 | ``` 14 | 15 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 16 | 17 | ```json 18 | { 19 | "status": "ok", 20 | "count": 2 21 | } 22 | ``` 23 | 24 | برای دریافت تعداد سفارش‌های باز خود، از این درخواست استفاده نمایید. 25 | 26 | - **درخواست:** `GET /market/orders/open-count` 27 | - **محدودیت فراخوانی:** 15 درخواست در دقیقه 28 | 29 | ### پارامترهای ورودی 30 | | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه | 31 | |-----------|--------|------------------|-------------------------------|--------------------| 32 | | tradeType | string | تمام انواع سفارش | نوع سفارش اسپات یا فروش تعهدی | `spot` یا `margin` | 33 | 34 | ### پارامترهای پاسخ 35 | | پارامتر | نوع | توضیحات | نمونه | 36 | |---------|---------|-------------------------|-------| 37 | | count | integer | تعداد سفارشات باز کاربر | 2 | 38 | -------------------------------------------------------------------------------- /source/includes/internal/_notifications.md: -------------------------------------------------------------------------------- 1 | # اعلان‌های کاربر 2 | این اعلانات برای اطلاع‌رسانی به کاربر از سوی نوبیتکس ارسال می‌شود و در بخش اعلانات سایت و اپلیکیشن به نمایش در می‌آید. 3 | 4 | احراز هویت در API های این مجموعه الزامی است. 5 | 6 | ## گرفتن لیست اعلانات 7 | 8 | >نمونه درخواست: 9 | 10 | ```shell 11 | curl 'https://api.nobitex.ir/notifications/list' \ 12 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 13 | ``` 14 | 15 | ```javascript 16 | api.get('/notifications/list', { 17 | headers: {Authorization: 'Token yourTOKENhereHEX0000000000'}, 18 | }).then((response) => { 19 | console.log(response); 20 | }); 21 | ``` 22 | 23 | ```java 24 | public interface APIService { 25 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 26 | @GET("/notifications/list") 27 | Call listNotifications(); 28 | } 29 | 30 | APIService api = retrofit.create(APIService.class); 31 | 32 | Call call = api.listNotifications(); 33 | ``` 34 | 35 | ```plaintext 36 | GET /notifications/list HTTP/1.1 37 | Host: api.nobitex.ir 38 | Authorization: Token yourTOKENhereHEX0000000000 39 | ``` 40 | 41 | > در صورت فراخوانی درست، پاسخ شامل حداکثر ۱۰ اعلان اخیر کاربر به ترتیب معکوس زمانی و به این صورت خواهد بود: 42 | 43 | ```json 44 | { 45 | "status": "ok", 46 | "notifications": [ 47 | { 48 | "id": 345, 49 | "message": "پیغام۳", 50 | "createdAt": "2021-10-05T13:39:46.103353+00:00", 51 | "read": false 52 | }, 53 | { 54 | "id": 234, 55 | "message": "پیغام۲", 56 | "createdAt": "2021-10-04T15:29:46.103353+00:00", 57 | "read": false 58 | }, 59 | { 60 | "id": 123, 61 | "message": "به نوبیتکس خوش آمدید!", 62 | "createdAt": "2021-10-04T13:19:46.103353+00:00", 63 | "read": true 64 | } 65 | ] 66 | } 67 | ``` 68 | 69 | برای دریافت اعلانات کاربر از این نوع درخواست استفاده نمایید: 70 | 71 | * **درخواست:** `GET /notifications/list` 72 | 73 | ### پارامترهای پاسخ 74 | 75 | پارامتر | نوع | توضیحات | نمونه 76 | ------------- |----------------------|-------------------| --------- 77 | status | string | وضعیت پاسخ | ok 78 | notifications | list of Notification | لیستی از اعلان‌ها | [] 79 | 80 | شی Notification: 81 | 82 | پارامتر | نوع | توضیحات | نمونه 83 | ------- | ---- | --------- | --------- 84 | id | integer | شناسه اعلان | 1 85 | message | string | متن پیام | "به نوبیتکس خوش آمدید!" 86 | createdAt | iso-string | زمان ایجاد | "2021-10-04T13:19:46.103353+00:00" 87 | read | boolean | خوانده شده | false 88 | 89 | 90 | 91 | ## تغییر وضعیت اعلان یا اعلان‌ها به خوانده‌شده 92 | 93 | >نمونه درخواست: 94 | 95 | ```shell 96 | curl --location 'https://api.nobitex.ir/notifications/read' \ 97 | --header 'Authorization: Token yourTOKENhereHEX0000000000' \ 98 | --data '{"id":"234,345"}' 99 | ``` 100 | 101 | 102 | ```java 103 | public interface APIService { 104 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 105 | @FormUrlEncoded 106 | @POST("/notifications/read") 107 | Call readNotifications(@Field("id") String notificationIds); 108 | } 109 | 110 | APIService api = retrofit.create(APIService.class); 111 | 112 | Call call = api.readNotifications("234,345"); 113 | ``` 114 | 115 | ```plaintext 116 | POST /notifications/read HTTP/1.1 117 | Host: api.nobitex.ir 118 | Authorization: Token yourTOKENhereHEX0000000000 119 | Content-Type: application/json 120 | {"id": "234,345"} 121 | ``` 122 | 123 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 124 | 125 | ```json 126 | { 127 | "status": "ok", 128 | "processed": 2 129 | } 130 | ``` 131 | 132 | برای تغییر وضعیت اعلانات کاربر از نخوانده به خوانده‌شده، از این نوع درخواست استفاده نمایید: 133 | 134 | * **درخواست:** `POST /notifications/read` 135 | - **محدودیت فراخوانی:** ۱۰ درخواست در دقیقه یا ۶۰ بار در ساعت 136 | 137 | ### پارامترهای ورودی 138 | 139 | پارامتر | نوع | پیش‌فرض | توضیحات | نمونه 140 | ------- |---------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| --------- 141 | id | string | اختیاری | رشته‌ای از شناسه‌های اعلان‌های درخواستی برای تغییر وضعیت به خوانده‌شده که با کاما از هم جدا شده‌اند. در صورت فرستادن رشته‌ی خالی، هیچ اعلانی خوانده نمی‌شود. | "234,345" 142 | 143 | 144 | ### پارامترهای پاسخ 145 | 146 | پارامتر | نوع | توضیحات | نمونه 147 | ------------- |--------|-------------------------| --------- 148 | status | string | وضعیت پاسخ | ok 149 | processed | int | تعداد اعلان‌های خوانده‌شده | 2 150 | -------------------------------------------------------------------------------- /source/includes/internal/_transactions.md: -------------------------------------------------------------------------------- 1 | #تراکنش‌های مالی 2 | هر گونه تغییر در موجودی کیف‌پول کاربر توسط یک تراکنش ایجاد و ثبت می‌شود. افزایش یا کسری موجودی در اثر واریز، برداشت، معامله و کارمزد همگی نمونه‌ای از تراکنش‌های مالی کاربر هستند. 3 | 4 | 5 | ### نکات و ملاحظات 6 | احراز هویت در API های این مجموعه الزامی است. 7 | 8 | 9 | ## تاریخچه تراکنش‌ها 10 | 11 | >نمونه درخواست: 12 | 13 | ```shell 14 | curl 'https://api.nobitex.ir/users/transactions-history' \ 15 | -H 'Authorization: Token yourTOKENhereHEX0000000000' 16 | ``` 17 | 18 | ```javascript 19 | api.get('/users/transactions-history', { 20 | headers: {Authorization: 'Token yourTOKENhereHEX0000000000'}, 21 | }).then((response) => { 22 | console.log(response); 23 | }); 24 | ``` 25 | 26 | ```java 27 | public interface APIService { 28 | @Headers({"Authorization: Token yourTOKENhereHEX0000000000"}) 29 | @GET("/users/transactions-history") 30 | Call listTransactions(); 31 | } 32 | 33 | APIService api = retrofit.create(APIService.class); 34 | 35 | Call call = api.listTransactions(); 36 | ``` 37 | 38 | ```plaintext 39 | GET /users/transactions-history HTTP/1.1 40 | Host: api.nobitex.ir 41 | Authorization: Token yourTOKENhereHEX0000000000 42 | ``` 43 | 44 | > در صورت فراخوانی درست، پاسخ به این صورت خواهد بود: 45 | 46 | ```json 47 | { 48 | "status": "ok", 49 | "transactions": [ 50 | { 51 | "id": 1, 52 | "tp": "deposit", 53 | "type": "واریز", 54 | "created_at": "2021-11-13T14:35:18.766Z", 55 | "currency": "rls", 56 | "amount": "10000000.0000000000", 57 | "balance": "10000000.0000000000", 58 | "description": "واریز شتابی - شماره کارت: 123456******1234 - شماره پیگیری: 39577-bpiZpZw", 59 | "calculatedFee": null 60 | }, 61 | { 62 | "id": 2, 63 | "tp": "sell", 64 | "type": "معامله", 65 | "created_at": "2021-11-23T15:47:12.835Z", 66 | "currency": "rls", 67 | "amount": "-8000000.0000000000", 68 | "balance": "2000000.0000000000", 69 | "description": "خرید 32.00 USDT به قیمت واحد ﷼250000", 70 | "calculatedFee": null 71 | }, 72 | { 73 | "id": 3, 74 | "tp": "buy", 75 | "type": "معامله", 76 | "created_at": "2021-11-23T15:47:12.835Z", 77 | "currency": "usdt", 78 | "amount": "32.0000000000", 79 | "balance": "32.0000000000", 80 | "description": "خرید 32.00 USDT به قیمت واحد ﷼250000", 81 | "calculatedFee": null 82 | } 83 | ], 84 | "hasNext": false 85 | } 86 | ``` 87 | 88 | برای دریافت تاریخچه همه تراکنش‌های مالی کاربر از این نوع درخواست استفاده نمایید: 89 | 90 | * **درخواست:** `GET /users/transactions-history` 91 | * **محدودیت فراخوانی:** 60 درخواست در ساعت 92 | * **صفحه بندی:** دارد (پیش فرض 50) 93 | 94 | 95 | ### پارامترهای پاسخ 96 | 97 | پارامتر | نوع | توضیحات | نمونه 98 | ------- | ---- | --------- | --------- 99 | status | string | وضعیت پاسخ | ok 100 | transactions | list of Transaction | لیستی از تراکنش‌ها | [] 101 | hasNext | boolean | آیا لیست ادامه دارد؟ | false 102 | 103 | 104 | ### شی Transaction 105 | 106 | پارامتر | نوع | توضیحات | نمونه 107 | ------- | ---- | --------- | --------- 108 | id | integer | شناسه تراکنش | 1 109 | tp | string | نوع تراکنش | "deposit" 110 | type | string | نوع قابل فهم | "واریز" 111 | createdAt | iso-string | زمان ایجاد | "2021-11-13T14:35:18.766Z" 112 | currency | string | نوع ارز | "rls" 113 | amount | monetary | مقدار | "10000000.0000000000" 114 | balance | monetary | موجودی نهایی | "10000000.0000000000" 115 | description | string | توضیحات | "واریز شتابی - شماره کارت: 123456******1234 - شماره پیگیری: 39577-bpiZpZw" 116 | calculatedFee | monetary | کارمزد حساب شده | null 117 | 118 | 1. **نوع تراکنش:** می‌تواند یکی از مقادیر `deposit` (واریز)، `withdraw` (برداشت)، `buy` و `sell` (معامله)، `fee` (کارمزد)، `gateway` (درگاه)، `ex_src` و `ex_dst` (صرافی) و `manual` (سیستمی) باشد. 119 | 2. **مقدار:** در تراکنش مقدار منفی نشان‌دهنده کاهش موجودی و مقدار مثبت نشان‌دهنده افزایش موجودی می‌باشد. 120 | -------------------------------------------------------------------------------- /source/index.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: مستندات API نوبیتکس 3 | lang: fa 4 | language_tabs: 5 | - shell 6 | - plaintext 7 | includes: 8 | - intro 9 | - market_data 10 | - user_data 11 | - market_trade 12 | - position 13 | - withdraw 14 | - websocket 15 | - address_book 16 | - security 17 | - referral 18 | - auth 19 | - portfolio 20 | - other 21 | - general_notes 22 | - faq 23 | - symbols 24 | toc_footers: 25 | - سابقه تغییرات API 26 | - شرایط استفاده از API 27 | - مخزن گیت‌هاب 28 | - کالکشن Postman 29 | - سایت نوبیتکس 30 | --- 31 | -------------------------------------------------------------------------------- /source/internal.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: مستندات API داخلی نوبیتکس 3 | lang: fa 4 | language_tabs: 5 | - shell 6 | - javascript 7 | - java 8 | - swift 9 | - plaintext 10 | includes: 11 | - internal/2fa 12 | - internal/notifications 13 | - internal/wallet_invoice 14 | - internal/price_alerts 15 | - internal/transactions 16 | - internal/gift 17 | - internal/ticketing 18 | - internal/batch_actions 19 | - internal/active_order_count 20 | toc_footers: 21 | - سایت نوبیتکس 22 | --- 23 | 24 | # مستندات API داخلی نوبیتکس 25 | 26 | > جهت استفاده از نمونه کدهای مستند ابتدا تنظیمات زیر را استفاده نمایید. 27 | 28 | ```shell 29 | sudo apt install curl 30 | ``` 31 | 32 | ```javascript 33 | const axios = require("axios"); 34 | 35 | const api = axios.create({baseURL: "https://api.nobitex.ir"}); 36 | ``` 37 | 38 | ```java 39 | import com.google.gson.JsonObject; 40 | import retrofit2.Call; 41 | import retrofit2.http.GET; 42 | import retrofit2.http.POST; 43 | import retrofit2.http.Headers; 44 | import retrofit2.http.Query; 45 | import retrofit2.http.Field; 46 | import retrofit2.http.FormUrlEncoded; 47 | import retrofit2.converter.gson.GsonConverterFactory; 48 | 49 | Retrofit retrofit = new Retrofit.Builder() 50 | .baseUrl('https://api.nobitex.ir') 51 | .addConverterFactory(GsonConverterFactory.create()) 52 | .build(); 53 | ``` 54 | 55 | ```swift 56 | // Contact us 57 | ``` 58 | 59 | مستندات این بخش، سایر APIهای نوبیتکس را که عموما با بازار نوبیتکس ارتباطی نداشته و بیشتر ناظر به نیازهای ارتباطی و عملکردی سایت و اپلیکیشن نوبیتکس می‌باشد، توضیح می‌دهد. 60 | 61 | توجه داشته باشید بعضی از APIها نیاز به احراز هویت و دریافت توکن دارد که می‌توانید از [مستندات احراز هویت](/#intro-auth) نحوه عملکرد آن را مطالعه کنید. 62 | -------------------------------------------------------------------------------- /source/javascripts/all.js: -------------------------------------------------------------------------------- 1 | //= require ./all_nosearch 2 | //= require ./app/_search 3 | -------------------------------------------------------------------------------- /source/javascripts/all_nosearch.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_copy 3 | //= require ./app/_toc 4 | //= require ./app/_lang 5 | 6 | function adjustLanguageSelectorWidth() { 7 | const elem = $('.dark-box > .lang-selector'); 8 | elem.width(elem.parent().width()); 9 | } 10 | 11 | $(function() { 12 | loadToc($('#toc'), '.toc-link', '.toc-list-h2', 10); 13 | setupLanguages($('body').data('languages')); 14 | $('.content').imagesLoaded( function() { 15 | window.recacheHeights(); 16 | window.refreshToc(); 17 | }); 18 | 19 | $(window).resize(function() { 20 | adjustLanguageSelectorWidth(); 21 | }); 22 | adjustLanguageSelectorWidth(); 23 | }); 24 | 25 | window.onpopstate = function() { 26 | activateLanguage(getLanguageFromQueryString()); 27 | }; 28 | -------------------------------------------------------------------------------- /source/javascripts/app/_copy.js: -------------------------------------------------------------------------------- 1 | function copyToClipboard(container) { 2 | const el = document.createElement('textarea'); 3 | el.value = container.textContent.replace(/\n$/, ''); 4 | document.body.appendChild(el); 5 | el.select(); 6 | document.execCommand('copy'); 7 | document.body.removeChild(el); 8 | } 9 | 10 | function setupCodeCopy() { 11 | $('pre.highlight').prepend('
Copy to Clipboard
'); 12 | $('.copy-clipboard').on('click', function() { 13 | copyToClipboard(this.parentNode.children[1]); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /source/javascripts/app/_lang.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_jquery 2 | 3 | /* 4 | Copyright 2008-2013 Concur Technologies, Inc. 5 | 6 | Licensed under the Apache License, Version 2.0 (the "License"); you may 7 | not use this file except in compliance with the License. You may obtain 8 | a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, software 13 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15 | License for the specific language governing permissions and limitations 16 | under the License. 17 | */ 18 | ;(function () { 19 | 'use strict'; 20 | 21 | var languages = []; 22 | 23 | window.setupLanguages = setupLanguages; 24 | window.activateLanguage = activateLanguage; 25 | window.getLanguageFromQueryString = getLanguageFromQueryString; 26 | 27 | function activateLanguage(language) { 28 | if (!language) return; 29 | if (language === "") return; 30 | 31 | $(".lang-selector a").removeClass('active'); 32 | $(".lang-selector a[data-language-name='" + language + "']").addClass('active'); 33 | for (var i=0; i < languages.length; i++) { 34 | $(".highlight.tab-" + languages[i]).hide(); 35 | $(".lang-specific." + languages[i]).hide(); 36 | } 37 | $(".highlight.tab-" + language).show(); 38 | $(".lang-specific." + language).show(); 39 | 40 | window.recacheHeights(); 41 | 42 | // scroll to the new location of the position 43 | if ($(window.location.hash).get(0)) { 44 | $(window.location.hash).get(0).scrollIntoView(true); 45 | } 46 | } 47 | 48 | // parseURL and stringifyURL are from https://github.com/sindresorhus/query-string 49 | // MIT licensed 50 | // https://github.com/sindresorhus/query-string/blob/7bee64c16f2da1a326579e96977b9227bf6da9e6/license 51 | function parseURL(str) { 52 | if (typeof str !== 'string') { 53 | return {}; 54 | } 55 | 56 | str = str.trim().replace(/^(\?|#|&)/, ''); 57 | 58 | if (!str) { 59 | return {}; 60 | } 61 | 62 | return str.split('&').reduce(function (ret, param) { 63 | var parts = param.replace(/\+/g, ' ').split('='); 64 | var key = parts[0]; 65 | var val = parts[1]; 66 | 67 | key = decodeURIComponent(key); 68 | // missing `=` should be `null`: 69 | // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters 70 | val = val === undefined ? null : decodeURIComponent(val); 71 | 72 | if (!ret.hasOwnProperty(key)) { 73 | ret[key] = val; 74 | } else if (Array.isArray(ret[key])) { 75 | ret[key].push(val); 76 | } else { 77 | ret[key] = [ret[key], val]; 78 | } 79 | 80 | return ret; 81 | }, {}); 82 | }; 83 | 84 | function stringifyURL(obj) { 85 | return obj ? Object.keys(obj).sort().map(function (key) { 86 | var val = obj[key]; 87 | 88 | if (Array.isArray(val)) { 89 | return val.sort().map(function (val2) { 90 | return encodeURIComponent(key) + '=' + encodeURIComponent(val2); 91 | }).join('&'); 92 | } 93 | 94 | return encodeURIComponent(key) + '=' + encodeURIComponent(val); 95 | }).join('&') : ''; 96 | }; 97 | 98 | // gets the language set in the query string 99 | function getLanguageFromQueryString() { 100 | if (location.search.length >= 1) { 101 | var language = parseURL(location.search).language; 102 | if (language) { 103 | return language; 104 | } else if (jQuery.inArray(location.search.substr(1), languages) != -1) { 105 | return location.search.substr(1); 106 | } 107 | } 108 | 109 | return false; 110 | } 111 | 112 | // returns a new query string with the new language in it 113 | function generateNewQueryString(language) { 114 | var url = parseURL(location.search); 115 | if (url.language) { 116 | url.language = language; 117 | return stringifyURL(url); 118 | } 119 | return language; 120 | } 121 | 122 | // if a button is clicked, add the state to the history 123 | function pushURL(language) { 124 | if (!history) { return; } 125 | var hash = window.location.hash; 126 | if (hash) { 127 | hash = hash.replace(/^#+/, ''); 128 | } 129 | history.pushState({}, '', '?' + generateNewQueryString(language) + '#' + hash); 130 | 131 | // save language as next default 132 | if (localStorage) { 133 | localStorage.setItem("language", language); 134 | } 135 | } 136 | 137 | function setupLanguages(l) { 138 | var defaultLanguage = null; 139 | if (localStorage) { 140 | defaultLanguage = localStorage.getItem("language"); 141 | } 142 | 143 | languages = l; 144 | 145 | var presetLanguage = getLanguageFromQueryString(); 146 | if (presetLanguage) { 147 | // the language is in the URL, so use that language! 148 | activateLanguage(presetLanguage); 149 | 150 | if (localStorage) { 151 | localStorage.setItem("language", presetLanguage); 152 | } 153 | } else if ((defaultLanguage !== null) && (jQuery.inArray(defaultLanguage, languages) != -1)) { 154 | // the language was the last selected one saved in localstorage, so use that language! 155 | activateLanguage(defaultLanguage); 156 | } else { 157 | // no language selected, so use the default 158 | activateLanguage(languages[0]); 159 | } 160 | } 161 | 162 | // if we click on a language tab, activate that language 163 | $(function() { 164 | $(".lang-selector a").on("click", function() { 165 | var language = $(this).data("language-name"); 166 | pushURL(language); 167 | activateLanguage(language); 168 | return false; 169 | }); 170 | }); 171 | })(); 172 | -------------------------------------------------------------------------------- /source/javascripts/app/_search.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_lunr 2 | //= require ../lib/_jquery 3 | //= require ../lib/_jquery.highlight 4 | ;(function () { 5 | 'use strict'; 6 | 7 | var content, searchResults; 8 | var highlightOpts = { element: 'span', className: 'search-highlight' }; 9 | var searchDelay = 0; 10 | var timeoutHandle = 0; 11 | var index; 12 | 13 | function populate() { 14 | index = lunr(function(){ 15 | 16 | this.ref('id'); 17 | this.field('title', { boost: 10 }); 18 | this.field('body'); 19 | this.pipeline.add(lunr.trimmer, lunr.stopWordFilter); 20 | var lunrConfig = this; 21 | 22 | $('h1, h2').each(function() { 23 | var title = $(this); 24 | var body = title.nextUntil('h1, h2'); 25 | lunrConfig.add({ 26 | id: title.prop('id'), 27 | title: title.text(), 28 | body: body.text() 29 | }); 30 | }); 31 | 32 | }); 33 | determineSearchDelay(); 34 | } 35 | 36 | $(populate); 37 | $(bind); 38 | 39 | function determineSearchDelay() { 40 | if (index.tokenSet.toArray().length>5000) { 41 | searchDelay = 300; 42 | } 43 | } 44 | 45 | function bind() { 46 | content = $('.content'); 47 | searchResults = $('.search-results'); 48 | 49 | $('#input-search').on('keyup',function(e) { 50 | var wait = function() { 51 | return function(executingFunction, waitTime){ 52 | clearTimeout(timeoutHandle); 53 | timeoutHandle = setTimeout(executingFunction, waitTime); 54 | }; 55 | }(); 56 | wait(function(){ 57 | search(e); 58 | }, searchDelay); 59 | }); 60 | } 61 | 62 | function search(event) { 63 | 64 | var searchInput = $('#input-search')[0]; 65 | 66 | unhighlight(); 67 | searchResults.addClass('visible'); 68 | 69 | // ESC clears the field 70 | if (event.keyCode === 27) searchInput.value = ''; 71 | 72 | if (searchInput.value) { 73 | var results = index.search(searchInput.value).filter(function(r) { 74 | return r.score > 0.0001; 75 | }); 76 | 77 | if (results.length) { 78 | searchResults.empty(); 79 | $.each(results, function (index, result) { 80 | var elem = document.getElementById(result.ref); 81 | searchResults.append("
  • " + $(elem).text() + "
  • "); 82 | }); 83 | highlight.call(searchInput); 84 | } else { 85 | searchResults.html('
  • '); 86 | $('.search-results li').text('No Results Found for "' + searchInput.value + '"'); 87 | } 88 | } else { 89 | unhighlight(); 90 | searchResults.removeClass('visible'); 91 | } 92 | } 93 | 94 | function highlight() { 95 | if (this.value) content.highlight(this.value, highlightOpts); 96 | } 97 | 98 | function unhighlight() { 99 | content.unhighlight(highlightOpts); 100 | } 101 | })(); 102 | 103 | -------------------------------------------------------------------------------- /source/javascripts/app/_toc.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_jquery 2 | //= require ../lib/_imagesloaded.min 3 | ;(function () { 4 | 'use strict'; 5 | 6 | var htmlPattern = /<[^>]*>/g; 7 | var loaded = false; 8 | 9 | var debounce = function(func, waitTime) { 10 | var timeout = false; 11 | return function() { 12 | if (timeout === false) { 13 | setTimeout(function() { 14 | func(); 15 | timeout = false; 16 | }, waitTime); 17 | timeout = true; 18 | } 19 | }; 20 | }; 21 | 22 | var closeToc = function() { 23 | $(".toc-wrapper").removeClass('open'); 24 | $("#nav-button").removeClass('open'); 25 | }; 26 | 27 | function loadToc($toc, tocLinkSelector, tocListSelector, scrollOffset) { 28 | var headerHeights = {}; 29 | var pageHeight = 0; 30 | var windowHeight = 0; 31 | var originalTitle = document.title; 32 | 33 | var recacheHeights = function() { 34 | headerHeights = {}; 35 | pageHeight = $(document).height(); 36 | windowHeight = $(window).height(); 37 | 38 | $toc.find(tocLinkSelector).each(function() { 39 | var targetId = $(this).attr('href'); 40 | if (targetId[0] === "#") { 41 | headerHeights[targetId] = $("#" + $.escapeSelector(targetId.substring(1))).offset().top; 42 | } 43 | }); 44 | }; 45 | 46 | var refreshToc = function() { 47 | var currentTop = $(document).scrollTop() + scrollOffset; 48 | 49 | if (currentTop + windowHeight >= pageHeight) { 50 | // at bottom of page, so just select last header by making currentTop very large 51 | // this fixes the problem where the last header won't ever show as active if its content 52 | // is shorter than the window height 53 | currentTop = pageHeight + 1000; 54 | } 55 | 56 | var best = null; 57 | for (var name in headerHeights) { 58 | if ((headerHeights[name] < currentTop && headerHeights[name] > headerHeights[best]) || best === null) { 59 | best = name; 60 | } 61 | } 62 | 63 | // Catch the initial load case 64 | if (currentTop == scrollOffset && !loaded) { 65 | best = window.location.hash; 66 | loaded = true; 67 | } 68 | 69 | var $best = $toc.find("[href='" + best + "']").first(); 70 | if (!$best.hasClass("active")) { 71 | // .active is applied to the ToC link we're currently on, and its parent
      s selected by tocListSelector 72 | // .active-expanded is applied to the ToC links that are parents of this one 73 | $toc.find(".active").removeClass("active"); 74 | $toc.find(".active-parent").removeClass("active-parent"); 75 | $best.addClass("active"); 76 | $best.parents(tocListSelector).addClass("active").siblings(tocLinkSelector).addClass('active-parent'); 77 | $best.siblings(tocListSelector).addClass("active"); 78 | $toc.find(tocListSelector).filter(":not(.active)").slideUp(150); 79 | $toc.find(tocListSelector).filter(".active").slideDown(150); 80 | if (window.history.replaceState) { 81 | window.history.replaceState(null, "", best); 82 | } 83 | var thisTitle = $best.data("title"); 84 | if (thisTitle !== undefined && thisTitle.length > 0) { 85 | document.title = thisTitle.replace(htmlPattern, "") + " – " + originalTitle; 86 | } else { 87 | document.title = originalTitle; 88 | } 89 | } 90 | }; 91 | 92 | var makeToc = function() { 93 | recacheHeights(); 94 | refreshToc(); 95 | 96 | $("#nav-button").click(function() { 97 | $(".toc-wrapper").toggleClass('open'); 98 | $("#nav-button").toggleClass('open'); 99 | return false; 100 | }); 101 | $(".page-wrapper").click(closeToc); 102 | $(".toc-link").click(closeToc); 103 | 104 | // reload immediately after scrolling on toc click 105 | $toc.find(tocLinkSelector).click(function() { 106 | setTimeout(function() { 107 | refreshToc(); 108 | }, 0); 109 | }); 110 | 111 | $(window).scroll(debounce(refreshToc, 200)); 112 | $(window).resize(debounce(recacheHeights, 200)); 113 | }; 114 | 115 | makeToc(); 116 | 117 | window.recacheHeights = recacheHeights; 118 | window.refreshToc = refreshToc; 119 | } 120 | 121 | window.loadToc = loadToc; 122 | })(); 123 | -------------------------------------------------------------------------------- /source/javascripts/lib/_energize.js: -------------------------------------------------------------------------------- 1 | /** 2 | * energize.js v0.1.0 3 | * 4 | * Speeds up click events on mobile devices. 5 | * https://github.com/davidcalhoun/energize.js 6 | */ 7 | 8 | (function() { // Sandbox 9 | /** 10 | * Don't add to non-touch devices, which don't need to be sped up 11 | */ 12 | if(!('ontouchstart' in window)) return; 13 | 14 | var lastClick = {}, 15 | isThresholdReached, touchstart, touchmove, touchend, 16 | click, closest; 17 | 18 | /** 19 | * isThresholdReached 20 | * 21 | * Compare touchstart with touchend xy coordinates, 22 | * and only fire simulated click event if the coordinates 23 | * are nearby. (don't want clicking to be confused with a swipe) 24 | */ 25 | isThresholdReached = function(startXY, xy) { 26 | return Math.abs(startXY[0] - xy[0]) > 5 || Math.abs(startXY[1] - xy[1]) > 5; 27 | }; 28 | 29 | /** 30 | * touchstart 31 | * 32 | * Save xy coordinates when the user starts touching the screen 33 | */ 34 | touchstart = function(e) { 35 | this.startXY = [e.touches[0].clientX, e.touches[0].clientY]; 36 | this.threshold = false; 37 | }; 38 | 39 | /** 40 | * touchmove 41 | * 42 | * Check if the user is scrolling past the threshold. 43 | * Have to check here because touchend will not always fire 44 | * on some tested devices (Kindle Fire?) 45 | */ 46 | touchmove = function(e) { 47 | // NOOP if the threshold has already been reached 48 | if(this.threshold) return false; 49 | 50 | this.threshold = isThresholdReached(this.startXY, [e.touches[0].clientX, e.touches[0].clientY]); 51 | }; 52 | 53 | /** 54 | * touchend 55 | * 56 | * If the user didn't scroll past the threshold between 57 | * touchstart and touchend, fire a simulated click. 58 | * 59 | * (This will fire before a native click) 60 | */ 61 | touchend = function(e) { 62 | // Don't fire a click if the user scrolled past the threshold 63 | if(this.threshold || isThresholdReached(this.startXY, [e.changedTouches[0].clientX, e.changedTouches[0].clientY])) { 64 | return; 65 | } 66 | 67 | /** 68 | * Create and fire a click event on the target element 69 | * https://developer.mozilla.org/en/DOM/event.initMouseEvent 70 | */ 71 | var touch = e.changedTouches[0], 72 | evt = document.createEvent('MouseEvents'); 73 | evt.initMouseEvent('click', true, true, window, 0, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); 74 | evt.simulated = true; // distinguish from a normal (nonsimulated) click 75 | e.target.dispatchEvent(evt); 76 | }; 77 | 78 | /** 79 | * click 80 | * 81 | * Because we've already fired a click event in touchend, 82 | * we need to listed for all native click events here 83 | * and suppress them as necessary. 84 | */ 85 | click = function(e) { 86 | /** 87 | * Prevent ghost clicks by only allowing clicks we created 88 | * in the click event we fired (look for e.simulated) 89 | */ 90 | var time = Date.now(), 91 | timeDiff = time - lastClick.time, 92 | x = e.clientX, 93 | y = e.clientY, 94 | xyDiff = [Math.abs(lastClick.x - x), Math.abs(lastClick.y - y)], 95 | target = closest(e.target, 'A') || e.target, // needed for standalone apps 96 | nodeName = target.nodeName, 97 | isLink = nodeName === 'A', 98 | standAlone = window.navigator.standalone && isLink && e.target.getAttribute("href"); 99 | 100 | lastClick.time = time; 101 | lastClick.x = x; 102 | lastClick.y = y; 103 | 104 | /** 105 | * Unfortunately Android sometimes fires click events without touch events (seen on Kindle Fire), 106 | * so we have to add more logic to determine the time of the last click. Not perfect... 107 | * 108 | * Older, simpler check: if((!e.simulated) || standAlone) 109 | */ 110 | if((!e.simulated && (timeDiff < 500 || (timeDiff < 1500 && xyDiff[0] < 50 && xyDiff[1] < 50))) || standAlone) { 111 | e.preventDefault(); 112 | e.stopPropagation(); 113 | if(!standAlone) return false; 114 | } 115 | 116 | /** 117 | * Special logic for standalone web apps 118 | * See http://stackoverflow.com/questions/2898740/iphone-safari-web-app-opens-links-in-new-window 119 | */ 120 | if(standAlone) { 121 | window.location = target.getAttribute("href"); 122 | } 123 | 124 | /** 125 | * Add an energize-focus class to the targeted link (mimics :focus behavior) 126 | * TODO: test and/or remove? Does this work? 127 | */ 128 | if(!target || !target.classList) return; 129 | target.classList.add("energize-focus"); 130 | window.setTimeout(function(){ 131 | target.classList.remove("energize-focus"); 132 | }, 150); 133 | }; 134 | 135 | /** 136 | * closest 137 | * @param {HTMLElement} node current node to start searching from. 138 | * @param {string} tagName the (uppercase) name of the tag you're looking for. 139 | * 140 | * Find the closest ancestor tag of a given node. 141 | * 142 | * Starts at node and goes up the DOM tree looking for a 143 | * matching nodeName, continuing until hitting document.body 144 | */ 145 | closest = function(node, tagName){ 146 | var curNode = node; 147 | 148 | while(curNode !== document.body) { // go up the dom until we find the tag we're after 149 | if(!curNode || curNode.nodeName === tagName) { return curNode; } // found 150 | curNode = curNode.parentNode; // not found, so keep going up 151 | } 152 | 153 | return null; // not found 154 | }; 155 | 156 | /** 157 | * Add all delegated event listeners 158 | * 159 | * All the events we care about bubble up to document, 160 | * so we can take advantage of event delegation. 161 | * 162 | * Note: no need to wait for DOMContentLoaded here 163 | */ 164 | document.addEventListener('touchstart', touchstart, false); 165 | document.addEventListener('touchmove', touchmove, false); 166 | document.addEventListener('touchend', touchend, false); 167 | document.addEventListener('click', click, true); // TODO: why does this use capture? 168 | 169 | })(); -------------------------------------------------------------------------------- /source/javascripts/lib/_imagesloaded.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * imagesLoaded PACKAGED v4.1.4 3 | * JavaScript is all like "You images are done yet or what?" 4 | * MIT License 5 | */ 6 | 7 | !function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o (default options) 16 | * $('#content').highlight('lorem'); 17 | * 18 | * // search for and highlight more terms at once 19 | * // so you can save some time on traversing DOM 20 | * $('#content').highlight(['lorem', 'ipsum']); 21 | * $('#content').highlight('lorem ipsum'); 22 | * 23 | * // search only for entire word 'lorem' 24 | * $('#content').highlight('lorem', { wordsOnly: true }); 25 | * 26 | * // don't ignore case during search of term 'lorem' 27 | * $('#content').highlight('lorem', { caseSensitive: true }); 28 | * 29 | * // wrap every occurrance of term 'ipsum' in content 30 | * // with 31 | * $('#content').highlight('ipsum', { element: 'em', className: 'important' }); 32 | * 33 | * // remove default highlight 34 | * $('#content').unhighlight(); 35 | * 36 | * // remove custom highlight 37 | * $('#content').unhighlight({ element: 'em', className: 'important' }); 38 | * 39 | * 40 | * Copyright (c) 2009 Bartek Szopka 41 | * 42 | * Licensed under MIT license. 43 | * 44 | */ 45 | 46 | jQuery.extend({ 47 | highlight: function (node, re, nodeName, className) { 48 | if (node.nodeType === 3) { 49 | var match = node.data.match(re); 50 | if (match) { 51 | var highlight = document.createElement(nodeName || 'span'); 52 | highlight.className = className || 'highlight'; 53 | var wordNode = node.splitText(match.index); 54 | wordNode.splitText(match[0].length); 55 | var wordClone = wordNode.cloneNode(true); 56 | highlight.appendChild(wordClone); 57 | wordNode.parentNode.replaceChild(highlight, wordNode); 58 | return 1; //skip added node in parent 59 | } 60 | } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children 61 | !/(script|style)/i.test(node.tagName) && // ignore script and style nodes 62 | !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted 63 | for (var i = 0; i < node.childNodes.length; i++) { 64 | i += jQuery.highlight(node.childNodes[i], re, nodeName, className); 65 | } 66 | } 67 | return 0; 68 | } 69 | }); 70 | 71 | jQuery.fn.unhighlight = function (options) { 72 | var settings = { className: 'highlight', element: 'span' }; 73 | jQuery.extend(settings, options); 74 | 75 | return this.find(settings.element + "." + settings.className).each(function () { 76 | var parent = this.parentNode; 77 | parent.replaceChild(this.firstChild, this); 78 | parent.normalize(); 79 | }).end(); 80 | }; 81 | 82 | jQuery.fn.highlight = function (words, options) { 83 | var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false }; 84 | jQuery.extend(settings, options); 85 | 86 | if (words.constructor === String) { 87 | words = [words]; 88 | } 89 | words = jQuery.grep(words, function(word, i){ 90 | return word != ''; 91 | }); 92 | words = jQuery.map(words, function(word, i) { 93 | return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 94 | }); 95 | if (words.length == 0) { return this; }; 96 | 97 | var flag = settings.caseSensitive ? "" : "i"; 98 | var pattern = "(" + words.join("|") + ")"; 99 | if (settings.wordsOnly) { 100 | pattern = "\\b" + pattern + "\\b"; 101 | } 102 | var re = new RegExp(pattern, flag); 103 | 104 | return this.each(function () { 105 | jQuery.highlight(this, re, settings.element, settings.className); 106 | }); 107 | }; 108 | 109 | -------------------------------------------------------------------------------- /source/layouts/layout.erb: -------------------------------------------------------------------------------- 1 | <%# 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | %> 16 | <% language_tabs = current_page.data.language_tabs || [] %> 17 | <% page_content = yield %> 18 | <% 19 | if current_page.data.includes 20 | current_page.data.includes.each do |include| 21 | page_content += partial("includes/#{include}") 22 | end 23 | end 24 | %> 25 | 26 | 27 | "> 28 | 29 | 30 | 31 | 32 | <% if current_page.data.key?('meta') %> 33 | <% current_page.data.meta.each do |meta| %> 34 | 36 | <%= "#{key}=\"#{value}\"" %> 37 | <% end %> 38 | > 39 | <% end %> 40 | <% end %> 41 | <%= current_page.data.title || "API Documentation" %> 42 | 43 | 46 | 52 | <%= stylesheet_link_tag :screen, media: :screen %> 53 | <%= stylesheet_link_tag :print, media: :print %> 54 | <%= stylesheet_link_tag :custom %> 55 | <% if current_page.data.search %> 56 | <%= javascript_include_tag "all" %> 57 | <% else %> 58 | <%= javascript_include_tag "all_nosearch" %> 59 | <% end %> 60 | 61 | <% if current_page.data.code_clipboard %> 62 | 65 | <% end %> 66 | 67 | 68 | 69 | 70 | 71 | NAV 72 | <%= image_tag('navbar.png') %> 73 | 74 | 75 |
      76 | <%= image_tag "logo.png", class: 'logo' %> 77 | "> 78 | <% if language_tabs.any? %> 79 |
      80 | <% language_tabs.each do |lang| %> 81 | <% if lang.is_a? Hash %> 82 | <%= lang.values.first %> 83 | <% else %> 84 | <%= lang %> 85 | <% end %> 86 | <% end %> 87 |
      88 | <% end %> 89 | <% if current_page.data.search %> 90 | 93 |
        94 | <% end %> 95 |
          96 | <% toc_data(page_content).each do |h1| %> 97 |
        • 98 | <%= h1[:content] %> 99 | <% if h1[:children].length > 0 %> 100 |
            101 | <% h1[:children].each do |h2| %> 102 |
          • 103 | <%= h2[:content] %> 104 |
          • 105 | <% end %> 106 |
          107 | <% end %> 108 |
        • 109 | <% end %> 110 |
        111 | <% if current_page.data.toc_footers %> 112 | 117 | <% end %> 118 |
        119 |
        120 |
        121 |
        122 | <%= page_content %> 123 |
        124 |
        125 | <% if language_tabs.any? %> 126 |
        127 | <% language_tabs.each do |lang| %> 128 | <% if lang.is_a? Hash %> 129 | <%= lang.values.first %> 130 | <% else %> 131 | <%= lang %> 132 | <% end %> 133 | <% end %> 134 |
        135 | <% end %> 136 |
        137 |
        138 | 139 | 140 | -------------------------------------------------------------------------------- /source/postman/Nobitex Gateway Testnet.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "1c466724-e931-459b-b644-39d2e2b0addf", 4 | "name": "Nobitex Gateway Testnet", 5 | "description": "https://apidocs.nobitex.ir/gateway", 6 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" 7 | }, 8 | "item": [ 9 | { 10 | "name": "token (testnet)", 11 | "request": { 12 | "method": "POST", 13 | "header": [ 14 | { 15 | "key": "Content-Type", 16 | "name": "Content-Type", 17 | "value": "application/json", 18 | "type": "text" 19 | } 20 | ], 21 | "body": { 22 | "mode": "raw", 23 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"amount\":1000000,\n\t\"callbackURL\":\"http://localhost\",\n\t\"factorNumber\":\"10\",\n\t\"mobile\":\"09123456789\",\n\t\"description\":\"Test Payment with Nobitex\",\n\t\"currencies\":\"btc\"\n}" 24 | }, 25 | "url": { 26 | "raw": "https://testnetapi.nobitex.ir/pg/send/", 27 | "protocol": "https", 28 | "host": [ 29 | "testnetapi", 30 | "nobitex", 31 | "market" 32 | ], 33 | "path": [ 34 | "pg", 35 | "send", 36 | "" 37 | ] 38 | } 39 | }, 40 | "response": [ 41 | { 42 | "name": "token (testnet)", 43 | "originalRequest": { 44 | "method": "POST", 45 | "header": [ 46 | { 47 | "key": "Content-Type", 48 | "name": "Content-Type", 49 | "value": "application/json", 50 | "type": "text" 51 | } 52 | ], 53 | "body": { 54 | "mode": "raw", 55 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"amount\":1000000,\n\t\"callbackURL\":\"http://localhost\",\n\t\"factorNumber\":\"10\",\n\t\"mobile\":\"09123456789\",\n\t\"description\":\"Test Payment with Nobitex\",\n\t\"currencies\":\"btc\"\n}" 56 | }, 57 | "url": { 58 | "raw": "https://testnetapi.nobitex.ir/pg/send/", 59 | "protocol": "https", 60 | "host": [ 61 | "testnetapi", 62 | "nobitex", 63 | "market" 64 | ], 65 | "path": [ 66 | "pg", 67 | "send", 68 | "" 69 | ] 70 | } 71 | }, 72 | "status": "OK", 73 | "code": 200, 74 | "_postman_previewlanguage": "json", 75 | "header": [ 76 | { 77 | "key": "Server", 78 | "value": "nginx/1.14.0 (Ubuntu)" 79 | }, 80 | { 81 | "key": "Date", 82 | "value": "Sat, 14 Sep 2019 11:00:56 GMT" 83 | }, 84 | { 85 | "key": "Content-Type", 86 | "value": "application/json" 87 | }, 88 | { 89 | "key": "Content-Length", 90 | "value": "66" 91 | }, 92 | { 93 | "key": "Connection", 94 | "value": "keep-alive" 95 | }, 96 | { 97 | "key": "Vary", 98 | "value": "Accept, Origin" 99 | }, 100 | { 101 | "key": "Allow", 102 | "value": "POST, OPTIONS" 103 | }, 104 | { 105 | "key": "Strict-Transport-Security", 106 | "value": "max-age=31536000; includeSubdomains" 107 | }, 108 | { 109 | "key": "X-Frame-Options", 110 | "value": "DENY" 111 | }, 112 | { 113 | "key": "X-XSS-Protection", 114 | "value": "1; mode=block" 115 | }, 116 | { 117 | "key": "Referrer-Policy", 118 | "value": "origin-when-cross-origin" 119 | }, 120 | { 121 | "key": "X-Content-Type-Options", 122 | "value": "nosniff" 123 | } 124 | ], 125 | "cookie": [], 126 | "body": "{\n \"status\": \"success\",\n \"token\": \"f6838d15fb024b0eb6d83e4c2a2028d3\"\n}" 127 | } 128 | ] 129 | }, 130 | { 131 | "name": "verify payment (testnet)", 132 | "request": { 133 | "method": "POST", 134 | "header": [ 135 | { 136 | "key": "Content-Type", 137 | "name": "Content-Type", 138 | "value": "application/json", 139 | "type": "text" 140 | } 141 | ], 142 | "body": { 143 | "mode": "raw", 144 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"token\":\"f50116d31d4a4d1ab93d1f2759f198bb\"\n}" 145 | }, 146 | "url": { 147 | "raw": "https://testnetapi.nobitex.ir/pg/verify/", 148 | "protocol": "https", 149 | "host": [ 150 | "testnetapi", 151 | "nobitex", 152 | "market" 153 | ], 154 | "path": [ 155 | "pg", 156 | "verify", 157 | "" 158 | ] 159 | } 160 | }, 161 | "response": [ 162 | { 163 | "name": "verify payment (testnet)", 164 | "originalRequest": { 165 | "method": "POST", 166 | "header": [ 167 | { 168 | "key": "Content-Type", 169 | "name": "Content-Type", 170 | "value": "application/json", 171 | "type": "text" 172 | } 173 | ], 174 | "body": { 175 | "mode": "raw", 176 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"token\":\"f50116d31d4a4d1ab93d1f2759f198bb\"\n}" 177 | }, 178 | "url": { 179 | "raw": "https://testnetapi.nobitex.ir/pg/verify/", 180 | "protocol": "https", 181 | "host": [ 182 | "testnetapi", 183 | "nobitex", 184 | "market" 185 | ], 186 | "path": [ 187 | "pg", 188 | "verify", 189 | "" 190 | ] 191 | } 192 | }, 193 | "status": "OK", 194 | "code": 200, 195 | "_postman_previewlanguage": "json", 196 | "header": [ 197 | { 198 | "key": "Server", 199 | "value": "nginx/1.14.0 (Ubuntu)" 200 | }, 201 | { 202 | "key": "Date", 203 | "value": "Sat, 14 Sep 2019 11:35:51 GMT" 204 | }, 205 | { 206 | "key": "Content-Type", 207 | "value": "application/json" 208 | }, 209 | { 210 | "key": "Content-Length", 211 | "value": "200" 212 | }, 213 | { 214 | "key": "Connection", 215 | "value": "keep-alive" 216 | }, 217 | { 218 | "key": "Vary", 219 | "value": "Accept, Origin" 220 | }, 221 | { 222 | "key": "Allow", 223 | "value": "POST, OPTIONS" 224 | }, 225 | { 226 | "key": "Strict-Transport-Security", 227 | "value": "max-age=31536000; includeSubdomains" 228 | }, 229 | { 230 | "key": "X-Frame-Options", 231 | "value": "DENY" 232 | }, 233 | { 234 | "key": "X-XSS-Protection", 235 | "value": "1; mode=block" 236 | }, 237 | { 238 | "key": "Referrer-Policy", 239 | "value": "origin-when-cross-origin" 240 | }, 241 | { 242 | "key": "X-Content-Type-Options", 243 | "value": "nosniff" 244 | } 245 | ], 246 | "cookie": [], 247 | "body": "{\n \"status\": \"success\",\n \"amount\": 1000000,\n \"cryptoAmount\": 85516,\n \"txHash\": \"825d6613a6eef4566abf4ba7bae83618\",\n \"factorNumber\": \"10\",\n \"mobile\": \"09123456789\",\n \"description\": \"Test Payment with Nobitex\"\n}" 248 | } 249 | ] 250 | } 251 | ] 252 | } 253 | -------------------------------------------------------------------------------- /source/postman/Nobitex Gateway.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "0c525a53-2c6a-48f5-8111-5ae3657f28aa", 4 | "name": "Nobitex Gateway", 5 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" 6 | }, 7 | "item": [ 8 | { 9 | "name": "token", 10 | "request": { 11 | "method": "POST", 12 | "header": [ 13 | { 14 | "key": "Content-Type", 15 | "name": "Content-Type", 16 | "value": "application/json", 17 | "type": "text" 18 | } 19 | ], 20 | "body": { 21 | "mode": "raw", 22 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"amount\":1000000,\n\t\"callbackURL\":\"https://nobitex.ir\",\n\t\"factorNumber\":\"10\",\n\t\"mobile\":\"09123456789\",\n\t\"description\":\"Payment with Nobitex\",\n\t\"currencies\":\"btc\"\n}" 23 | }, 24 | "url": { 25 | "raw": "https://api.nobitex.ir/pg/send/", 26 | "protocol": "https", 27 | "host": [ 28 | "api", 29 | "nobitex", 30 | "market" 31 | ], 32 | "path": [ 33 | "pg", 34 | "send", 35 | "" 36 | ] 37 | } 38 | }, 39 | "response": [ 40 | { 41 | "name": "token", 42 | "originalRequest": { 43 | "method": "POST", 44 | "header": [ 45 | { 46 | "key": "Content-Type", 47 | "name": "Content-Type", 48 | "value": "application/json", 49 | "type": "text" 50 | } 51 | ], 52 | "body": { 53 | "mode": "raw", 54 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"amount\":1000000,\n\t\"callbackURL\":\"https://nobitex.ir\",\n\t\"factorNumber\":\"10\",\n\t\"mobile\":\"09123456789\",\n\t\"description\":\"Payment with Nobitex\",\n\t\"currencies\":\"btc\"\n}" 55 | }, 56 | "url": { 57 | "raw": "https://api.nobitex.ir/pg/send/", 58 | "protocol": "https", 59 | "host": [ 60 | "api", 61 | "nobitex", 62 | "market" 63 | ], 64 | "path": [ 65 | "pg", 66 | "send", 67 | "" 68 | ] 69 | } 70 | }, 71 | "status": "OK", 72 | "code": 200, 73 | "_postman_previewlanguage": "json", 74 | "header": [ 75 | { 76 | "key": "Server", 77 | "value": "nginx/1.14.0 (Ubuntu)" 78 | }, 79 | { 80 | "key": "Date", 81 | "value": "Sat, 14 Sep 2019 11:00:56 GMT" 82 | }, 83 | { 84 | "key": "Content-Type", 85 | "value": "application/json" 86 | }, 87 | { 88 | "key": "Content-Length", 89 | "value": "66" 90 | }, 91 | { 92 | "key": "Connection", 93 | "value": "keep-alive" 94 | }, 95 | { 96 | "key": "Vary", 97 | "value": "Accept, Origin" 98 | }, 99 | { 100 | "key": "Allow", 101 | "value": "POST, OPTIONS" 102 | }, 103 | { 104 | "key": "Strict-Transport-Security", 105 | "value": "max-age=31536000; includeSubdomains" 106 | }, 107 | { 108 | "key": "X-Frame-Options", 109 | "value": "DENY" 110 | }, 111 | { 112 | "key": "X-XSS-Protection", 113 | "value": "1; mode=block" 114 | }, 115 | { 116 | "key": "Referrer-Policy", 117 | "value": "origin-when-cross-origin" 118 | }, 119 | { 120 | "key": "X-Content-Type-Options", 121 | "value": "nosniff" 122 | } 123 | ], 124 | "cookie": [], 125 | "body": "{\n \"status\": \"success\",\n \"token\": \"f6838d15fb024b0eb6d83e4c2a2028d3\"\n}" 126 | } 127 | ] 128 | }, 129 | { 130 | "name": "verify payment", 131 | "request": { 132 | "method": "POST", 133 | "header": [ 134 | { 135 | "key": "Content-Type", 136 | "name": "Content-Type", 137 | "value": "application/json", 138 | "type": "text" 139 | } 140 | ], 141 | "body": { 142 | "mode": "raw", 143 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"token\":\"f50116d31d4a4d1ab93d1f2759f198bb\"\n}" 144 | }, 145 | "url": { 146 | "raw": "https://api.nobitex.ir/pg/verify/", 147 | "protocol": "https", 148 | "host": [ 149 | "api", 150 | "nobitex", 151 | "market" 152 | ], 153 | "path": [ 154 | "pg", 155 | "verify", 156 | "" 157 | ] 158 | } 159 | }, 160 | "response": [ 161 | { 162 | "name": "verify payment", 163 | "originalRequest": { 164 | "method": "POST", 165 | "header": [ 166 | { 167 | "key": "Content-Type", 168 | "name": "Content-Type", 169 | "value": "application/json", 170 | "type": "text" 171 | } 172 | ], 173 | "body": { 174 | "mode": "raw", 175 | "raw": "{\n\t\"api\":\"DemoApiKey\",\n\t\"token\":\"f50116d31d4a4d1ab93d1f2759f198bb\"\n}" 176 | }, 177 | "url": { 178 | "raw": "https://api.nobitex.ir/pg/verify/", 179 | "protocol": "https", 180 | "host": [ 181 | "api", 182 | "nobitex", 183 | "market" 184 | ], 185 | "path": [ 186 | "pg", 187 | "verify", 188 | "" 189 | ] 190 | } 191 | }, 192 | "status": "OK", 193 | "code": 200, 194 | "_postman_previewlanguage": "json", 195 | "header": [ 196 | { 197 | "key": "Server", 198 | "value": "nginx/1.14.0 (Ubuntu)" 199 | }, 200 | { 201 | "key": "Date", 202 | "value": "Sat, 14 Sep 2019 11:35:51 GMT" 203 | }, 204 | { 205 | "key": "Content-Type", 206 | "value": "application/json" 207 | }, 208 | { 209 | "key": "Content-Length", 210 | "value": "200" 211 | }, 212 | { 213 | "key": "Connection", 214 | "value": "keep-alive" 215 | }, 216 | { 217 | "key": "Vary", 218 | "value": "Accept, Origin" 219 | }, 220 | { 221 | "key": "Allow", 222 | "value": "POST, OPTIONS" 223 | }, 224 | { 225 | "key": "Strict-Transport-Security", 226 | "value": "max-age=31536000; includeSubdomains" 227 | }, 228 | { 229 | "key": "X-Frame-Options", 230 | "value": "DENY" 231 | }, 232 | { 233 | "key": "X-XSS-Protection", 234 | "value": "1; mode=block" 235 | }, 236 | { 237 | "key": "Referrer-Policy", 238 | "value": "origin-when-cross-origin" 239 | }, 240 | { 241 | "key": "X-Content-Type-Options", 242 | "value": "nosniff" 243 | } 244 | ], 245 | "cookie": [], 246 | "body": "{\n \"status\": \"success\",\n \"amount\": 1000000,\n \"cryptoAmount\": 85516,\n \"txHash\": \"825d6613a6eef4566abf4ba7bae83618\",\n \"factorNumber\": \"10\",\n \"mobile\": \"09123456789\",\n \"description\": \"Test Payment with Nobitex\"\n}" 247 | } 248 | ] 249 | } 250 | ] 251 | } 252 | -------------------------------------------------------------------------------- /source/stylesheets/_icon-font.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'slate'; 3 | src:font-url('slate.eot?-syv14m'); 4 | src:font-url('slate.eot?#iefix-syv14m') format('embedded-opentype'), 5 | font-url('slate.woff2?-syv14m') format('woff2'), 6 | font-url('slate.woff?-syv14m') format('woff'), 7 | font-url('slate.ttf?-syv14m') format('truetype'), 8 | font-url('slate.svg?-syv14m#slate') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | 13 | %icon { 14 | font-family: 'slate'; 15 | speak: none; 16 | font-style: normal; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | } 22 | 23 | %icon-exclamation-sign { 24 | @extend %icon; 25 | content: "\e600"; 26 | } 27 | %icon-info-sign { 28 | @extend %icon; 29 | content: "\e602"; 30 | } 31 | %icon-ok-sign { 32 | @extend %icon; 33 | content: "\e606"; 34 | } 35 | %icon-search { 36 | @extend %icon; 37 | content: "\e607"; 38 | } 39 | -------------------------------------------------------------------------------- /source/stylesheets/_rtl.scss: -------------------------------------------------------------------------------- 1 | :lang(fa) { 2 | //////////////////////////////////////////////////////////////////////////////// 3 | // RTL Styles Variables 4 | //////////////////////////////////////////////////////////////////////////////// 5 | 6 | $default: auto; 7 | 8 | //////////////////////////////////////////////////////////////////////////////// 9 | // TABLE OF CONTENTS 10 | //////////////////////////////////////////////////////////////////////////////// 11 | 12 | #toc>ul>li>a>span { 13 | float: left; 14 | } 15 | 16 | .toc-wrapper { 17 | transition: right 0.3s ease-in-out !important; 18 | left: $default !important; 19 | #{right}: 0; 20 | } 21 | 22 | .toc-h2 { 23 | padding-#{right}: $nav-padding + $nav-indent; 24 | } 25 | 26 | #nav-button { 27 | #{right}: 0; 28 | transition: right 0.3s ease-in-out; 29 | &.open { 30 | right: $nav-width 31 | } 32 | } 33 | 34 | //////////////////////////////////////////////////////////////////////////////// 35 | // PAGE LAYOUT AND CODE SAMPLE BACKGROUND 36 | //////////////////////////////////////////////////////////////////////////////// 37 | .page-wrapper { 38 | margin-#{left}: $default !important; 39 | margin-#{right}: $nav-width; 40 | .dark-box { 41 | #{right}: $default; 42 | #{left}: 0; 43 | } 44 | } 45 | 46 | .lang-selector { 47 | width: $default !important; 48 | a { 49 | float: right; 50 | } 51 | } 52 | 53 | //////////////////////////////////////////////////////////////////////////////// 54 | // CODE SAMPLE STYLES 55 | //////////////////////////////////////////////////////////////////////////////// 56 | .content { 57 | &>h1, 58 | &>h2, 59 | &>h3, 60 | &>h4, 61 | &>h5, 62 | &>h6, 63 | &>p, 64 | &>table, 65 | &>ul, 66 | &>ol, 67 | &>aside, 68 | &>dl { 69 | margin-#{left}: $examples-width; 70 | margin-#{right}: $default !important; 71 | } 72 | &>ul, 73 | &>ol { 74 | padding-#{right}: $main-padding + 15px; 75 | } 76 | table { 77 | th, 78 | td { 79 | text-align: right; 80 | } 81 | } 82 | dd { 83 | margin-#{right}: 15px; 84 | } 85 | aside { 86 | aside:before { 87 | padding-#{left}: 0.5em; 88 | } 89 | .search-highlight { 90 | background: linear-gradient(to top right, #F7E633 0%, #F1D32F 100%); 91 | } 92 | } 93 | pre, 94 | blockquote { 95 | float: left !important; 96 | clear: left !important; 97 | } 98 | } 99 | 100 | //////////////////////////////////////////////////////////////////////////////// 101 | // TYPOGRAPHY 102 | //////////////////////////////////////////////////////////////////////////////// 103 | @font-face { 104 | font-family: 'IRANSans'; 105 | src : url("../fonts/IRANSansFaNum/eot/IRANSansWeb(FaNum).eot"), url('../fonts/IRANSansFaNum/woff/IRANSansWeb(FaNum).woff') format('woff'), url('../fonts/IRANSansFaNum/ttf/IRANSansWeb(FaNum).ttf') format('truetype'), url("../fonts/IRANSansFaNum/woff2/IRANSansWeb(FaNum).woff2") format('woff2'); 106 | } 107 | 108 | h1, 109 | h2, 110 | h3, 111 | h4, 112 | h5, 113 | h6, 114 | p, 115 | aside, 116 | td, 117 | th, 118 | li, 119 | a, 120 | table { 121 | direction: rtl; 122 | font-family: "Vazir", serif !important; 123 | } 124 | 125 | .toc-wrapper { 126 | text-align: right; 127 | direction: rtl; 128 | font-weight: 100 !important; 129 | } 130 | 131 | td, th, .content table th, .content table td, li { 132 | text-align: right !important; 133 | } 134 | 135 | code { 136 | direction: ltr; 137 | } 138 | 139 | 140 | //////////////////////////////////////////////////////////////////////////////// 141 | // RESPONSIVE DESIGN 142 | //////////////////////////////////////////////////////////////////////////////// 143 | @media (max-width: $tablet-width) { 144 | .toc-wrapper { 145 | #{right}: -$nav-width; 146 | &.open { 147 | #{right}: 0; 148 | } 149 | } 150 | .page-wrapper { 151 | margin-#{right}: 0; 152 | } 153 | } 154 | 155 | @media (max-width: $phone-width) { 156 | %left-col { 157 | margin-#{left}: 0; 158 | } 159 | } 160 | 161 | } 162 | -------------------------------------------------------------------------------- /source/stylesheets/_variables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | */ 16 | 17 | 18 | //////////////////////////////////////////////////////////////////////////////// 19 | // CUSTOMIZE SLATE 20 | //////////////////////////////////////////////////////////////////////////////// 21 | // Use these settings to help adjust the appearance of Slate 22 | 23 | 24 | // BACKGROUND COLORS 25 | //////////////////// 26 | $nav-bg: #2E3336 !default; 27 | $examples-bg: #2E3336 !default; 28 | $code-bg: #1E2224 !default; 29 | $code-annotation-bg: #191D1F !default; 30 | $nav-subitem-bg: #1E2224 !default; 31 | $nav-active-bg: #0F75D4 !default; 32 | $nav-active-parent-bg: #1E2224 !default; // parent links of the current section 33 | $lang-select-border: #000 !default; 34 | $lang-select-bg: #1E2224 !default; 35 | $lang-select-active-bg: $examples-bg !default; // feel free to change this to blue or something 36 | $lang-select-pressed-bg: #111 !default; // color of language tab bg when mouse is pressed 37 | $main-bg: #F3F7F9 !default; 38 | $aside-notice-bg: #8fbcd4 !default; 39 | $aside-warning-bg: #c97a7e !default; 40 | $aside-success-bg: #6ac174 !default; 41 | $search-notice-bg: #c97a7e !default; 42 | 43 | 44 | // TEXT COLORS 45 | //////////////////// 46 | $main-text: #333 !default; // main content text color 47 | $nav-text: #fff !default; 48 | $nav-active-text: #fff !default; 49 | $nav-active-parent-text: #fff !default; // parent links of the current section 50 | $lang-select-text: #fff !default; // color of unselected language tab text 51 | $lang-select-active-text: #fff !default; // color of selected language tab text 52 | $lang-select-pressed-text: #fff !default; // color of language tab text when mouse is pressed 53 | 54 | 55 | // SIZES 56 | //////////////////// 57 | $nav-width: 230px !default; // width of the navbar 58 | $examples-width: 50% !default; // portion of the screen taken up by code examples 59 | $logo-margin: 20px !default; // margin below logo 60 | $main-padding: 28px !default; // padding to left and right of content & examples 61 | $nav-padding: 15px !default; // padding to left and right of navbar 62 | $nav-v-padding: 10px !default; // padding used vertically around search boxes and results 63 | $nav-indent: 10px !default; // extra padding for ToC subitems 64 | $code-annotation-padding: 13px !default; // padding inside code annotations 65 | $h1-margin-bottom: 21px !default; // padding under the largest header tags 66 | $tablet-width: 930px !default; // min width before reverting to tablet size 67 | $phone-width: $tablet-width - $nav-width !default; // min width before reverting to mobile size 68 | 69 | 70 | // FONTS 71 | //////////////////// 72 | $vazir-font-path:"../fonts/Vazir"; 73 | @font-face { 74 | font-family: 'Vazir'; 75 | src : url("#{$vazir-font-path}/Vazir-Light-FD.eot"), url('#{$vazir-font-path}/Vazir-Light-FD.woff') format('woff'), url('#{$vazir-font-path}/Vazir-Light-FD.ttf') format('truetype'), url("#{$vazir-font-path}/Vazir-Light-FD.woff2") format('woff2'); 76 | } 77 | 78 | %default-font { 79 | font-family: "Vazir",-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 80 | font-size: 14px; 81 | } 82 | 83 | %header-font { 84 | @extend %default-font; 85 | font-weight: bold; 86 | } 87 | 88 | %code-font { 89 | font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif; 90 | font-size: 12px; 91 | line-height: 1.5; 92 | } 93 | 94 | 95 | // OTHER 96 | //////////////////// 97 | $nav-footer-border-color: #666 !default; 98 | $search-box-border-color: #666 !default; 99 | 100 | 101 | //////////////////////////////////////////////////////////////////////////////// 102 | // INTERNAL 103 | //////////////////////////////////////////////////////////////////////////////// 104 | // These settings are probably best left alone. 105 | 106 | %break-words { 107 | word-break: break-all; 108 | hyphens: auto; 109 | } 110 | -------------------------------------------------------------------------------- /source/stylesheets/custom.css.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | @import 'variables'; 3 | 4 | .badge { 5 | font-size: 80%; 6 | background-color: rgba(0,0,0,0.05); 7 | padding: 0 3px; 8 | border-radius: 4px; 9 | } 10 | 11 | table td .long { 12 | display: inline-block; 13 | max-width: calc(25vw - 115px); 14 | word-wrap: break-word; 15 | } 16 | -------------------------------------------------------------------------------- /source/stylesheets/print.css.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | @import 'normalize'; 3 | @import 'variables'; 4 | @import 'icon-font'; 5 | 6 | /* 7 | Copyright 2008-2013 Concur Technologies, Inc. 8 | 9 | Licensed under the Apache License, Version 2.0 (the "License"); you may 10 | not use this file except in compliance with the License. You may obtain 11 | a copy of the License at 12 | 13 | http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | Unless required by applicable law or agreed to in writing, software 16 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 17 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 18 | License for the specific language governing permissions and limitations 19 | under the License. 20 | */ 21 | 22 | $print-color: #999; 23 | $print-color-light: #ccc; 24 | $print-font-size: 12px; 25 | 26 | body { 27 | @extend %default-font; 28 | } 29 | 30 | .tocify, .toc-footer, .lang-selector, .search, #nav-button { 31 | display: none; 32 | } 33 | 34 | .tocify-wrapper>img { 35 | margin: 0 auto; 36 | display: block; 37 | } 38 | 39 | .content { 40 | font-size: 12px; 41 | 42 | pre, code { 43 | @extend %code-font; 44 | @extend %break-words; 45 | border: 1px solid $print-color; 46 | border-radius: 5px; 47 | font-size: 0.8em; 48 | } 49 | 50 | pre { 51 | code { 52 | border: 0; 53 | } 54 | } 55 | 56 | pre { 57 | padding: 1.3em; 58 | } 59 | 60 | code { 61 | padding: 0.2em; 62 | } 63 | 64 | table { 65 | border: 1px solid $print-color; 66 | tr { 67 | border-bottom: 1px solid $print-color; 68 | } 69 | td,th { 70 | padding: 0.7em; 71 | } 72 | } 73 | 74 | p { 75 | line-height: 1.5; 76 | } 77 | 78 | a { 79 | text-decoration: none; 80 | color: #000; 81 | } 82 | 83 | h1 { 84 | @extend %header-font; 85 | font-size: 2.5em; 86 | padding-top: 0.5em; 87 | padding-bottom: 0.5em; 88 | margin-top: 1em; 89 | margin-bottom: $h1-margin-bottom; 90 | border: 2px solid $print-color-light; 91 | border-width: 2px 0; 92 | text-align: center; 93 | } 94 | 95 | h2 { 96 | @extend %header-font; 97 | font-size: 1.8em; 98 | margin-top: 2em; 99 | border-top: 2px solid $print-color-light; 100 | padding-top: 0.8em; 101 | } 102 | 103 | h1+h2, h1+div+h2 { 104 | border-top: none; 105 | padding-top: 0; 106 | margin-top: 0; 107 | } 108 | 109 | h3, h4 { 110 | @extend %header-font; 111 | font-size: 0.8em; 112 | margin-top: 1.5em; 113 | margin-bottom: 0.8em; 114 | text-transform: uppercase; 115 | } 116 | 117 | h5, h6 { 118 | text-transform: uppercase; 119 | } 120 | 121 | aside { 122 | padding: 1em; 123 | border: 1px solid $print-color-light; 124 | border-radius: 5px; 125 | margin-top: 1.5em; 126 | margin-bottom: 1.5em; 127 | line-height: 1.6; 128 | } 129 | 130 | aside:before { 131 | vertical-align: middle; 132 | padding-right: 0.5em; 133 | font-size: 14px; 134 | } 135 | 136 | aside.notice:before { 137 | @extend %icon-info-sign; 138 | } 139 | 140 | aside.warning:before { 141 | @extend %icon-exclamation-sign; 142 | } 143 | 144 | aside.success:before { 145 | @extend %icon-ok-sign; 146 | } 147 | } 148 | 149 | .copy-clipboard { 150 | @media print { 151 | display: none 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /source/terms/index.html.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: قوانین و شرایط استفاده از API نوبیتکس 3 | lang: fa 4 | toc_footers: 5 | - مستندات API نوبیتکس 6 | - سابقه تغییرات API 7 | - سایت نوبیتکس 8 | --- 9 | 10 | # قوانین و شرایط استفاده از API نوبیتکس 11 | 12 | ## ملاحظات استفاده عمومی 13 | 14 | * تنها بخشی از API نوبیتکس که در مستندات ذکر شده باشند، API عمومی و قابل استفاده نوبیتکس به شمار می‌آیند. اگر endpoint یا فیلدی در مستندات ذکر نشده باشد، ممکن است بدون اطلاع قبلی دچار تغییر شود. 15 | * ممکن است در طول زمان تغییراتی در API عمومی نوبیتکس رخ دهد. این تغییرات در صفحه 16 | «[سابقه تغییرات API نوبیتکس](/changelog/)» 17 | اطلاع‌رسانی خواهند شد. لازم است استفاده کنندگان به صورت منظم و هفتگی این صفحه را رصد نمایند و تغییرات لازم را در برنامه‌های خود اعمال نمایند. 18 | * نوبیتکس تضمین سطح سرویس SLA برای API خود به عموم مشتریان ارائه نمی‌دهد و استفاده کنندگان از API باید تمهیدات لازم در خصوص تشخیص و واکنش به اختلالات احتمالی در سرویس را انجام دهند. نوبیتکس در قبال هیچ گونه شرایط یا تغییراتی در API که احتمالاً باعث ایجاد مشکل در کد نوشته شده توسط کاربران شود، نخواهد داشت. 19 | * در صورت دریافت پاسخ مبنی بر استفاده نادرست از API، مانند خطای 429 یا سایر خطاهای ناشی از نرخ بالای درخواست‌ها یا ورودی نامعتبر، استفاده کننده ملزم است که واکنش مناسب را نسبت به خطا نشان داده و از تکرار اشتباه با بسامد بالا خودداری نماید. در صورت تشخیص استفاده نادرست و عدم واکنش مناسب به پیام‌های خطای دریافتی، ممکن است IP درخواست دهنده به صورت موقت یا دائمی در سرویس نوبیتکس مسدود شود. 20 | * استفاده آگاهانه از API نوبیتکس جهت نفوذ یا حملات DDoS یا سایر اعمال مخرب خلاف شرایط استفاده نوبیتکس است و در صورت مشاهده حساب‌های کاربری دخیل در آن مسدود خواهند شد. 21 | 22 | 23 | ## ملاحظات برنامه‌نویسی 24 | 25 | * خروجی API نوبیتکس معمولاً در قالب JSON ارائه می‌شود. لازم به دقت است که ممکن است علاوه بر فیلدهایی که در مستندات برای خروجی ذکر شده‌اند، فیلدهای دیگری نیز در خروجی پاسخ وجود داشته باشند. پیشنهاد می‌شود که برنامه خود را به صورتی توسعه دهید که در صورت وجود فیلدهای دیگری علاوه بر فیلدهای مورد انتظار، دچار خطا نشود. 26 | 27 | 28 | ## ملاحظات مرتبط با سرویس کلادفلر 29 | 30 | * نوبیتکس از سرویس کلادفلر به عنوان CDN و واسط API استفاده می‌نماید. در صورتی که به هر دلیل کلادفلر ترافیک ارسالی شما را مشکوک یا مخرب تشخیص دهد ممکن است برخی یا تمام درخواست‌های شما را رد کند. مدیریت این شرایط به دلیل اهمیت سرویس کلادفلر جهت جلوگیری از حملات DDoS ضروری و خارج از کنترل نوبیتکس است و استفاده کنندگان از API ملزم هستند نکات عمومی Fair Use را لحاظ نمایند. 31 | * امکان استفاده از API نوبیتکس هم از آی‌پی داخل و هم از آی‌پی خارج از کشور ممکن است و محدودیتی بابت استفاده از آی‌پی ایرانی روی درخواست‌ها اعمال نمی‌شود. 32 | * اتصال تمامی کاربران عادی سایت و اپ و API نوبیتکس به واسطه سرویس کلادفلر با سرورهای نوبیتکس که در داخل ایران مستقر هستند، برقرار می‌شود و امکان ارائه کانال مستقیم‌تر ارتباطی وجود ندارد. کاربران می‌توانند در صورت نیاز به کاهش تاخیر ارتباطی، نسبت به حداقل‌سازی تاخیر ارتباطی خود تا سرورهای لبه کلادفلر اقدام نمایند. 33 | --------------------------------------------------------------------------------