Code Monkey home page Code Monkey logo

ks-orderapi-python's Introduction

ks_api_client

No description provided

  • API version: 1.0.1
  • Package version: 1.0.15

Requirements.

Python 2.7 and 3.4+

Installation & Usage

pip install

If the python package is hosted on a repository, you can install directly using:

pip install git+https://github.com/osparamatrix/ks-orderapi-python.git

(you may need to run pip with root permission: sudo pip install git+https://github.com/osparamatrix/ks-orderapi-python.git)

Then import the package:

import ks_api_client

Setuptools

Install via Setuptools.

python setup.py install --user

(or sudo python setup.py install to install the package for all users)

Then import the package:

import ks_api_client

Getting Started

Please follow the installation procedure and then run the following:

from ks_api_client import ks_api
# Defining the host is optional and defaults to https://tradeapi.kotaksecurities.com/apim
# See configuration.py for a list of all supported configuration parameters.
client = ks_api.KSTradeApi(access_token = "", userid = "", \
                consumer_key = "", ip = "127.0.0.1", app_id = "")

#For using sandbox environment use host as https://sbx.kotaksecurities.com/apim
client = ks_api.KSTradeApi(access_token = "", userid = "", \
                consumer_key = "", ip = "127.0.0.1", app_id = "", host = "https://sbx.kotaksecurities.com/apim")
		
# Get session for user
client.login(password = "")

#Generated session token
client.session_2fa(access_code = "")

# Place an order
client.place_order(order_type = "N", instrument_token = 727, transaction_type = "BUY",\
                       quantity = 1, price = 0, disclosed_quantity = 0, trigger_price = 0,\
                            validity = "GFD", variety = "REGULAR", tag = "string")
# Place an MIS order
client.place_order(order_type = "MIS", instrument_token = 727, transaction_type = "BUY",\
                       quantity = 1, price = 0, disclosed_quantity = 0, trigger_price = 0,\
                            validity = "GFD", variety = "REGULAR", tag = "string")			    
						
# Modify an order
client.modify_order(order_id = "", quantity = 1, price = 0, disclosed_quantity = 0, trigger_price = 0, validity = "GFD")

# Cancel an order
client.cancel_order(order_id = "")

# Get Report Orders
client.order_report()

# Get Report Orders for order id
client.order_report(order_id = "")

# Get Margin required
order_info = [
    {"instrument_token": 727, "quantity": 1, "price": 1300, "amount": 0, "trigger_price": 1190},
    {"instrument_token": 1374, "quantity": 1, "price": 1200, "amount": 0, "trigger_price": 1150}
]
client.margin_required(transaction_type = "BUY",order_info = order_info)

# Get Positions
client.positions(position_type = "TODAYS")

# Get Quote details
client.quote(instrument_token = 110)

# Get Historical data
client.history("historicalprices",{"exchange":"bse","cocode":"476","fromdate":"01-jan-2014","todate":"08-oct-2015"})
client.history("historicalprices-unadjusted",{"exchange":"bse","co_code":"476","date":"16-Jun-2016"})
client.history("NSEFNO_HistoricalContinuousChart",{"symbol":"HDFC","expiry type": "near"})
client.history("LiveorEODHistorical",{"exchange":"BSE","co_code":"5400","period":"Y","cnt":"3"})

#Terminate user's Session
client.logout()

Documentation for API Endpoints

All URIs are relative to https://tradeapi.kotaksecurities.com/apim

Class Method Description
SessionApi ks_api.KSTradeApi Initialise Session
SessionApi login Login using Userid
SessionApi session_2fa Generate final Session Token
OrderApi place_order Place a New order
OrderApi modify_order Modify an existing order
OrderApi cancel_order Cancel an order
ReportsApi order_report Get order report
ReportsApi trade_report Get trade report
MarginApi margin_required Get Margin Required for an order by amount or quantity.
PositionsApi positions Get's Open position.
QuoteApi quote Get Quote details
HistoricalApi history Get historical data.
SessionApi logout Invalidate Session Token

ks-orderapi-python's People

Contributors

harshad5498 avatar osparamatrix avatar shubhamzemse94 avatar thebhushanp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ks-orderapi-python's Issues

How to pass "Session Token" from json file/database

As per this demo https://www.youtube.com/watch?v=_w-p17Oq6lE , the session token needs to be generated only once a day. and gets stored in-memory and can be called by the client at backend without storing it in a json/database or manually fetching it when required.
I have a serverless implementation (AWS lambda), where variables like session token needs to be passed from a file or database during the actual api call. I cannot use in-memory variables because the lambda function gets reset to intial state after every API call.
The way zerodha does it is by using the function kite.set_accesstoken() .

How do I perform a similar operation with kotak API?

Thanks

Websocket with multiple instruments

Hi successfully created client with efforts of 1 week and more now I am having issue to use the quotes api... Is it a web socket or just a one time request of quotes... How to subscribe to multiple instruments at a time... Kindly help with sample code...

Java API.

We would like to integrate the kotak to our software, but not able to find the JAVA SDK for the same.

Is there any plan for providing Java SDK. Our software is completely Java based and wont be possible to use Python in our code.

Invalid credentials

After trying to create client getting invalid credentials , unable to proceed.

client = ks_api.KSTradeApi(access_token = access_token, userid = userid ,consumer_key = consumer_key, ip = "", app_id = "")
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\ks_api.py", line 24, in init
session_init_res = ks_api_client.SessionApi(self.api_client).session_init(self.userid,
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api\session_api.py", line 397, in session_init
return self.session_init_with_http_info(userid, consumerKey, ip, appId, **kwargs) # noqa: E501
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api\session_api.py", line 510, in session_init_with_http_info
return self.api_client.call_api(
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api_client.py", line 354, in call_api
return self.__call_api(resource_path, method,
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api_client.py", line 173, in __call_api
raise e
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api_client.py", line 166, in __call_api
response_data = self.request(
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\api_client.py", line 380, in request
return self.rest_client.GET(url,
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\rest.py", line 220, in GET
return self.request("GET", url,
File "C:\Users\bhaskaja\AppData\Local\Continuum\anaconda3\lib\site-packages\ks_api_client\rest.py", line 214, in request
raise ApiException(status = r.status, reason = r.reason, body = r.data)
ks_api_client.exceptions.ApiException: (401)
Reason: Unauthorized
HTTP response body: {"fault":{"code":900901,"message":"Invalid Credentials","description":"Access failure for API: /apim/session/1.0, version: 1.0 status: (900901) - Invalid Credentials. Make sure you have provided the correct security credentials"}}

Unable to generate OTT using requests

I am trying to generate OTT using the method show in video :https://youtu.be/_w-p17Oq6lE?t=2014
But I am getting following error :

headers = {
    'accept' : 'application/json',
    'consumerKey': consumer_key,
    'ip' : ip,
    'appId': app_id,
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + access_token,
    }
data = '{"userid":"myid","password":"mypassword"}'
response = requests.get('https://tradeapi.kotaksecurities.com/apim/session/1.0/session/login/userid', headers=headers, data=data)
response.json()
{'fault': {'code': 405,
  'type': 'Status report',
  'message': 'Runtime Error',
  'description': 'Method not allowed for given API resource'}}

What should be done?

hw to get historical data

print(lient.history("historicalprices",{"exchange":"bse","cocode":"476","fromdate":"01-jan-2021","todate":"30-may-2021"}))

isuue =
Reason: Not Found
HTTP response body: <am:fault xmlns:am="http://wso2.org/apimanager">am:code404</am:code>am:typeStatus report</am:type>am:messageNot Found</am:message>am:descriptionThe requested resource is not available.</am:description></am:fault>

Urgent Help Needed

Traceback (most recent call last):
File "", line 2, in
File "C:\pythonFile\TradingApi\kotak_api_.py", line 244, in fetch
data = shubh.quote(code, 'DEPTH')
File "C:\pythonFile\lib\site-packages\ks_api_client\ks_api.py", line 220, in quote
quote = ks_api_client.QuoteApi(self.api_client).get_market_details_quote(self.consumer_key,
File "C:\pythonFile\lib\site-packages\ks_api_client\api\quote_api.py", line 362, in get_market_details_quote
return self.get_market_details_quote_with_http_info(consumerKey, sessionToken, instrumentTokens, **kwargs) # noqa: E501
File "C:\pythonFile\lib\site-packages\ks_api_client\api\quote_api.py", line 466, in get_market_details_quote_with_http_info
return self.api_client.call_api(
File "C:\pythonFile\lib\site-packages\ks_api_client\api_client.py", line 354, in call_api
return self.__call_api(resource_path, method,
File "C:\pythonFile\lib\site-packages\ks_api_client\api_client.py", line 173, in __call_api
raise e
File "C:\pythonFile\lib\site-packages\ks_api_client\api_client.py", line 166, in __call_api
response_data = self.request(
File "C:\pythonFile\lib\site-packages\ks_api_client\api_client.py", line 380, in request
return self.rest_client.GET(url,
File "C:\pythonFile\lib\site-packages\ks_api_client\rest.py", line 220, in GET
return self.request("GET", url,
File "C:\pythonFile\lib\site-packages\ks_api_client\rest.py", line 214, in request
raise ApiException(status = r.status, reason = r.reason, body = r.data)
ks_api_client.exceptions.ApiException: (500)
Reason: Internal Server Error
HTTP response body: {"fault":{"code":101504,"type":"Status report","message":"Runtime Error","description":"Send timeout"}}

⚠️ ⚠️ ⚠️ Warning To Kotak Securities and ks-orderapi-python ***

⚠️ ⚠️ ⚠️ Hey While I Was Trading A Exception was raised i missed a lot of chances to make money
It is a warning and a humble request to kotak securities improve the support for this api or We All Algo Trader Will Move To
Angle Broking's It is free and fast and nicely documented and shame to you that i am using angle smart api to get market history
and much more
If This Warning or feedback is Not Taken Seriously Then You Kotak Securities Will Lose A Lot of Customers
I Have More Than 10,000 + followers in instagram and on youtube make sure you take this warning seriously

Real time notification / Web sockets - order execution on account.

Hi Team,

Do we have real time notification endpoint for order execution ( aka web socket)? I am not seeing anything related to WS in the documentation.

PS: I am now making multiple calls in dedicated frequency to pull up order status, but most of the time I am getting request max quota reached error. (I have set unlimited request/max request per min in my application). Would be more sense, if we have ws for orders atleast.

Thanks

ip address resolution issue

The getting started code is showing issue in resolving the ip address in client initiation time.

Exception has occurred: ValueError (note: full exception trace is shown but execution is paused at: ip_address)
u'sbx.kotaksecurities.com' does not appear to be an IPv4 or IPv6 address
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/ipaddress.py", line 168, in ip_address (Current frame)
address)
File "/Users/sam/Desktop/KS/test.py", line 9, in
consumer_key = "14eIIxjvTbZ5FgnkeGFDnJlFA7oa", ip = "66.22.97.52", app_id = "DefaultApplication", host = "https://sbx.kotaksecurities.com/apim")

need help.

How to get Sandbox working?

I am able to get the production API working. But when I use the Sandbox Keys from https://tradeapi.kotaksecurities.com/devportal/applications/xxx/overview, I am getting

client = ks_api.KSTradeApi(access_token = SANDBOX_ACCESS_TOKEN, userid = USER_ID, \
                consumer_key = SANDBOX_CONSUMER_KEY, ip = "127.0.0.1", app_id = SANDBOX_APP_ID, \
                           host = "https://sbx.kotaksecurities.com/apim")


ApiException: (401)
Reason: Unauthorized
HTTP response body: {"fault":{"code":900901,"message":"Invalid Credentials","description":"Access failure for API: /apim/session/1.0, version: 1.0 status: (900901) - Invalid Credentials. Make sure you have provided the correct security credentials"}}

Generated access token in Sandbox keys with validity -1.

How do I access the sandbox website and generate tokens?

@kalilinux-png

Accessing Sandbox environment

Hi Could you please advise me

  1. if I can access the sandbox environment similar to the production environment from UI. If yes could you please share the steps to access.
  2. How can I see the order placed, profit/loss details in the sandbox environment.

Thanks in advance for your support and guidance.

how to get market order price

Once we set market order with

info = client.place_order(order_type = "N", instrument_token = 1900, transaction_type = "BUY",\
                       quantity = 1, price = 0, disclosed_quantity = 0, trigger_price = 0,\
                       validity = "GFD", variety = "REGULAR", tag = "string")

How to get the exact amount for which above order was executed?
The command client.positions('OPEN') gives netTrdValue which is average value of all the trades for today for each token.

MCX Order not going through via API

I have activated MCX and I am able to place order on MCX-Crude from web portal / mobile app.

But when I am placing order from API, it says

Error placing order.
Message: This facility is not available to you.
Description: Commodity orders facility is not available to you.

Please help.

OCO Order

Can anyone tell how to place OCO or Bracket order using API?
Also, what's the difference between O(Order) & N(NormalOrder) ??

is there any sample code ?

spent an hour running the first line of the code, to get a client.

client = ks_api.KSTradeApi(access_token = "", userid = "", \
                consumer_key = "", ip = "127.0.0.1", app_id = "")

I'm getting error -
Traceback (most recent call last):
File "d:/gitlab/one_algo/del/kotak_test.py", line 9, in
client = ks_api.KSTradeApi(access_token = "a11ac633-9112-3c74-9df1-d87a95c3f50c", userid = "KEE93_11",
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\ks_api.py", line 24, in init
session_init_res = ks_api_client.SessionApi(self.api_client).session_init(self.userid,
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api\session_api.py", line 397, in session_init
return self.session_init_with_http_info(userid, consumerKey, ip, appId, **kwargs) # noqa: E501
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api\session_api.py", line 510, in session_init_with_http_info
return self.api_client.call_api(
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api_client.py", line 354, in call_api
return self.__call_api(resource_path, method,
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api_client.py", line 173, in __call_api
raise e
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api_client.py", line 166, in __call_api
response_data = self.request(
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\api_client.py", line 380, in request
return self.rest_client.GET(url,
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\rest.py", line 220, in GET
return self.request("GET", url,
File "C:\Users\keerthan\AppData\Local\Programs\Python\Python38-32\lib\site-packages\ks_api_client\rest.py", line 214, in request
raise ApiException(status = r.status, reason = r.reason, body = r.data)
ks_api_client.exceptions.ApiException: (401)
Reason: Unauthorized
HTTP response body: {"fault":{"code":900901,"message":"Invalid Credentials","description":"Access failure for API: /apim/session/1.0, version: 1.0 status: (900901) - Invalid Credentials. Make sure you have provided the correct security
credentials"}}

Stop Loss Market order working like Market order strange!

It is wierd, when I place a stop loss market, it is getting closed immediately like a market order without considering trigger point and close the position. But when there is no open position it is working fine. Kindly check. Also when trying to place an SLM order with a different quantity for a open position I am getting the below Error, but when there is no open position it is working fine. Even stranger this is only happening for Options, for equity I did not face any issue.

basic SLM order code used.
resp = client.place_order(order_type = "MIS", instrument_token = 31207, transaction_type = 'SELL', quantity = 100,
price = 0, trigger_price = 5.2, tag = 'test') # LTP 9.5" Trying to place an SLM order @ 5.2 with different quanity 100 than position 50
print(resp)

#########Response########
Exception when calling OrderApi->place_order: (-1)
Reason: Order Cancel
HTTP response body: {"fault":{"code":-1,"description":"Order Quantity is greater then net traded quantity","message":"Order Cancel"}}

Unable to Login : Error Invalid Credentials

Please someone provide running code to login...not working tried all the probabilities

import json
from ks_api_client import ks_api

credentials_file = open("credentials.json","r")
credentials = json.load(credentials_file)
credentials_file.close()

try:
client = ks_api.KSTradeApi(access_token = credentials["accessToken"], userid = credentials["userID"],consumer_key = credentials["consumerKey"], ip = "", app_id = credentials["appID"])
client.login(password = credentials["password"])
client.session_2fa(access_code = "6032")

except Exception as e:
print("Exception %s\n" % e)

//Error is
Exception (401)
Reason: Unauthorized
HTTP response body: {"fault":{"code":900901,"message":"Invalid Credentials","description":"Access failure for API: /apim/session/1.0, version: 1.0 status: (900901) - Invalid Credentials. Make sure you have provided the correct security credentials"}}

//my username is which I use to login to my kotak account ...Should i use client ID instead?
//App ID is blank in my code
//i had set access token expiry to -1

quote_type OHLC

quote_type OHLC is for which time frame - 1 Min,5 Mins,15 Mins etc..?

Historical API Documentation

The documentation for historical API is so bad. What are the possible parameters that we can give through the object that is not given. Also, the history call in the sample code does not work. it returns the following error:
Screenshot 2021-10-27 at 4 48 47 PM

I request you to please improve your documentation. Also, what does the resource input do? what are the different possible outcomes? Nothing is mentioned.

Invalid Credentials (reference) , Invalid JWT Token (self contained JWT)

Hi Guys, I get Invalid Credentials and unauthorized.
Do we need to base64 encode consumer_key or any other key?
and where is the consumer_secret is used?
I could see a settings.py. file. do we need to configure that before using it?

client = ks_api.KSTradeApi(access_token=access_token,
                           userid=userid,
                           consumer_key=consumer_key,
                           ip=ip,
                           app_id=app_id,
                           host=sandbox_env_host
                           )

all the variables are substitutes copied from this below url default application.

https://ctradeapi.kotaksecurities.com/devportal/applications/*******-****-*****-*****-*****/sandboxkeys/oauth

still I get this error.

image

please find the traceback.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\ks_api.py", line 24, in __init__
    session_init_res  =  ks_api_client.SessionApi(self.api_client).session_init(self.userid, \
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api\session_api.py", line 397, in session_init
    return self.session_init_with_http_info(userid, consumerKey, ip, appId, **kwargs)  # noqa: E501
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api\session_api.py", line 510, in session_init_with_http_info
    return self.api_client.call_api(
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api_client.py", line 354, in call_api
    return self.__call_api(resource_path, method,
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api_client.py", line 173, in __call_api
    raise e
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api_client.py", line 166, in __call_api
    response_data = self.request(
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\api_client.py", line 380, in request
    return self.rest_client.GET(url,
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\rest.py", line 220, in GET
    return self.request("GET", url,
  File "D:\ajay\Work\Projects\Trading_StockMarket\trade_venv\lib\site-packages\ks_api_client\rest.py", line 214, in request
    raise ApiException(status = r.status, reason = r.reason, body = r.data)
ks_api_client.exceptions.ApiException: (401)
Reason: Unauthorized
HTTP response body: {"fault":{"code":900901,"message":"Invalid Credentials","description":"Access failure for API: /apim/session/1.0, version: 1.0 status: (900901) - Invalid Credentials. Make sure you have provided the correct security credentials"}}

How to square off an Intraday MIS order ??

When I'm trying to square off the MIS Sell order, I have to do it by placing a buy order, but then it shows insufficient capital even though I've already shorted the stock and it's in my open positions.

Working code for 2FA login without OTP

Hi,
I just saw that lot of people were looking for a way to login without a new OTP everyday. Kotak session_API allows us to do exactly that by using OTT (one time token) instead of OTP.
I have made a script to login without OTP which you can find here :
https://github.com/algowhizz/kotakapi/blob/master/2fa_ott_login.py

Before placing orders or any other operation, you have to pass the "user_session_token" to client using client.set_session_token function that I recently added to my fork of official Kotak repository. As an example :

client = ks_api.KSTradeApi(access_token = access_token, userid = user_id, 
                                        consumer_key = consumer_key, ip = kotak_ip, app_id = kotak_appId)
client.set_session_token(session_token=user_session_token)

You can check and install the fork from here :
https://github.com/algowhizz/ks-orderapi-python
Function that I added :
algowhizz@4cb939f

Request Quota reached error

I keep getting this error and have to wait for 1 minute before running the code again what to do in order to avoid this....

HTTP response body: {"fault":{"code":900807,"message":"Request quota reached","description":"You have surpassed the maximum number of requests for the minute, please wait until the next minute to start additional requests"}}

Error while adding a new application

I opened a new account with Kotak Securities. While adding a new application, I am getting this error - "Error while adding a new application for the user ". How to resolve this?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.