{% extends "zerver/portico.html" %}

{# API information page #}

{% block portico_content %}
    <h1 class="api-page-header">We hear you like APIs...</h1>

    <p>We have a <a href="/api/endpoints">well-documented API</a> that allows you to build custom integrations, in addition to our <a href="/integrations">existing integrations</a>. For ease-of-use, we've created a Python module that you can drop in to a project to start interacting with our API. There is also a <a href="https://github.com/zulip/zulip-js">JavaScript library</a> that can be used either in the browser or in Node.js.</p>

    <p><strong>Don't want to make it yourself?</strong> Zulip <a href="/integrations">already integrates with lots of services</a>.</p>

    <br/>
    <div class="centered-button">
       <a href="https://www.zulip.com/dist/api/python-zulip_0.2.5.tar.gz" class="btn btn-large btn-primary"><i class="icon-vector-download"></i> Download Python bindings and examples<span class="button-muted">Version 0.2.5</span></a>
    </div>


    <p>&nbsp;</p>

    <h3>Installation instructions</h3>
    <h4>Python</h4>
    <p>This package uses <tt>distutils</tt>, so you can just run <code>python setup.py install</code> after downloading.</p>
    <p>If you have <tt>setuptools</tt> installed on your system then the application's dependencies will be downloaded and installed automatically from <a href="https://pypi.python.org/">PyPI</a>. Otherwise, you'll need to make sure you have these Python libraries installed:</p>
    <ul>
      <li><tt>simplejson</tt></li>
      <li><tt>requests</tt> (0.12.1 or later)</li>
    </ul>
    <p>&nbsp;</p>
    <h4>JavaScript</h4>
    <p>Install it with <a href="https://www.npmjs.com/package/zulip-js">npm</a>:</p>
    <pre><code>npm install zulip-js</code></pre>

    <h3>Usage examples</h3>

    <ul class="nav nav-tabs" id="api-example-tabs">
      <li class="active"><a href="#curl" data-toggle="tab">curl</a></li>
      <li><a href="#python" data-toggle="tab">Python</a></li>
      <li><a href="#commandline" data-toggle="tab">zulip-send</a></li>
      <li><a href="#javascript" data-toggle="tab">JavaScript</a></li>
    </ul>

    <div class="tab-content">

      <div class="tab-pane active" id="curl">
        <p>No download required!</p>

{#
These code snippets are generated using our very own Zulip tool, by
sending them to myself in a code block, and then using the inspector
to pull out the resulting HTML :)
#}

<h4>Stream message</h4>
<div class="codehilite"><pre>curl {{ external_api_uri_subdomain }}/v1/messages <span class="se">\</span>
    -u BOT_EMAIL_ADDRESS:BOT_API_KEY <span class="se">\</span>
    -d <span class="s2">"type=stream"</span> <span class="se">\</span>
    -d <span class="s2">"to=Denmark"</span> <span class="se">\</span>
    -d <span class="s2">"subject=Castle"</span> <span class="se">\</span>
    -d <span class="s2">"content=Something is rotten in the state of Denmark."</span></pre>
</div>

<h4>Private message</h4>
<div class="codehilite"><pre>curl {{ external_api_uri_subdomain }}/v1/messages <span class="se">\</span>
    -u BOT_EMAIL_ADDRESS:BOT_API_KEY <span class="se">\</span>
    -d <span class="s2">"type=private"</span> <span class="se">\</span>
    -d <span class="s2">"to=hamlet@example.com"</span> <span class="se">\</span>
    -d <span class="s2">"content=I come not, friends, to steal away your hearts."</span></pre>
</div>

      </div>

      <div class="tab-pane" id="python">
<div class="codehilite"><pre><span class="c">#!/usr/bin/env python</span>

<span class="kn">import</span> <span class="nn">zulip</span>
<span class="kn">import</span> <span class="nn">sys</span>

<span class="c"># Keyword arguments 'email' and 'api_key' are not required if you are using ~/.zuliprc</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">zulip</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="p">email</span><span class="o">=</span><span class="s">"othello-bot@example.com"</span><span class="p">,</span>
                      <span class="n">api_key</span><span class="o">=</span><span class="s">"a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5"</span><span class="p">,</span>
                      <span class="n">site</span><span class="o">=</span><span class="s">"{{ external_api_uri_subdomain }}"</span><span class="p">)</span>
<span class="c"># Send a stream message</span>
<span class="n">client</span><span class="o">.</span><span class="n">send_message</span><span class="p">({</span>
    <span class="s">"type"</span><span class="p">:</span> <span class="s">"stream"</span><span class="p">,</span>
    <span class="s">"to"</span><span class="p">:</span> <span class="s">"Denmark"</span><span class="p">,</span>
    <span class="s">"subject"</span><span class="p">:</span> <span class="s">"Castle"</span><span class="p">,</span>
    <span class="s">"content"</span><span class="p">:</span> <span class="s">"Something is rotten in the state of Denmark."</span>
<span class="p">})</span>
<span class="c"># Send a private message</span>
<span class="n">client</span><span class="o">.</span><span class="n">send_message</span><span class="p">({</span>
    <span class="s">"type"</span><span class="p">:</span> <span class="s">"private"</span><span class="p">,</span>
    <span class="s">"to"</span><span class="p">:</span> <span class="s">"hamlet@example.com"</span><span class="p">,</span>
    <span class="s">"content"</span><span class="p">:</span> <span class="s">"I come not, friends, to steal away your hearts."</span>
<span class="p">})</span>

<span class="c"># Print each message the user receives</span>
<span class="c"># This is a blocking call that will run forever</span>
<span class="n">client</span><span class="o">.</span><span class="n">call_on_each_message</span><span class="p">(</span><span class="k">lambda</span> <span class="n">msg</span><span class="p">:</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">))</span>

<span class="c"># Print every event relevant to the user</span>
<span class="c"># This is a blocking call that will run forever</span>
<span class="c"># This will never be reached unless you comment out the previous line</span>
<span class="n">client</span><span class="o">.</span><span class="n">call_on_each_event</span><span class="p">(</span><span class="k">lambda</span> <span class="n">msg</span><span class="p">:</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">))</span>
</pre></div>
      </div>


      <div class="tab-pane" id="commandline">
        <p>You can use <code>zulip-send</code> (found in <code>bin/</code> in the tarball) to easily send Zulips from the command-line, providing the message to be sent on STDIN.</p>

<h4>Stream message</h4>
<div class="codehilite"><pre>zulip-send --stream Denmark --subject Castle \
--user othello-bot@example.com --api-key a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5{% if api_site_required %} \
--site={{ external_api_uri_subdomain }}{% endif %}</pre></div>

<h4>Private message</h4>
<div class="codehilite"><pre>zulip-send hamlet@example.com \
--user othello-bot@example.com --api-key a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5{% if api_site_required %} \
--site={{ external_api_uri_subdomain }}{% endif %}</pre></div>

<h4>Passing in the message on the command-line</h4>
<p>If you'd like, you can also provide the message on the command-line with the <code>-m</code> flag, as follows:</p>
<div class="codehilite"><pre>zulip-send --stream Denmark --subject Castle \
-m <span class="s2">"Something is rotten in the state of Denmark."</span> \
--user othello-bot@example.com --api-key a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5{% if api_site_required %} \
--site={{ external_api_uri_subdomain }}{% endif %}
</pre></div>

      <p>You can omit the <code>user</code>{% if api_site_required %}, <code>api-key</code>, and
      <code>site</code>{% else %} and <code>api-key</code>{% endif %} arguments if you have a
      <code>~/.zuliprc</code> file.
      </p>
      <p>See also the <a href="/api/endpoints">full API endpoint documentation.</a></p>
    </div>

<div class="tab-pane" id="javascript">
<p>More examples and documentation can be found <a href="https://github.com/zulip/zulip-js">here</a>.</p>

<div class="codehilite"><pre><span class="kr">const</span> <span class="nx">zulip</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'zulip'</span><span class="p">);</span>

<span class="kr">const</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
  <span class="nx">username</span><span class="o">:</span> <span class="s1">'othello-bot@example.com'</span><span class="p">,</span>
  <span class="nx">apiKey</span><span class="o">:</span> <span class="s1">'a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5'</span><span class="p">,</span>
  <span class="nx">realm</span><span class="o">:</span> <span class="s1">'{{ external_api_uri_subdomain }}'</span>
<span class="p">};</span>

<span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">zulip</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>

<span class="c1">// Send a message</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">send</span><span class="p">({</span>
  <span class="nx">to</span><span class="o">:</span> <span class="s1">'Denmark'</span><span class="p">,</span>
  <span class="nx">type</span><span class="o">:</span> <span class="s1">'stream'</span><span class="p">,</span>
  <span class="nx">subject</span><span class="o">:</span> <span class="s1">'Castle'</span><span class="p">,</span>
  <span class="nx">content</span><span class="o">:</span> <span class="s1">'Something is rotten in the state of Denmark.'</span>
<span class="p">});</span>

<span class="c1">// Send a private message</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">send</span><span class="p">({</span>
  <span class="nx">to</span><span class="o">:</span> <span class="s1">'hamlet@example.com'</span><span class="p">,</span>
  <span class="nx">type</span><span class="o">:</span> <span class="s1">'private'</span><span class="p">,</span>
  <span class="nx">content</span><span class="o">:</span> <span class="s1">'I come not, friends, to steal away your hearts.'</span>
<span class="p">});</span>

<span class="c1">// Register queue to receive messages for user</span>
<span class="nx">zulip</span><span class="p">.</span><span class="nx">queues</span><span class="p">.</span><span class="nx">register</span><span class="p">({</span>
  <span class="nx">event_types</span><span class="o">:</span> <span class="p">[</span><span class="s1">'message'</span><span class="p">]</span>
<span class="p">}).</span><span class="nx">then</span><span class="p">((</span><span class="nx">res</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="c1">// Retrieve events from a queue</span>
  <span class="c1">// Blocking until there is an event (or the request times out)</span>
  <span class="nx">zulip</span><span class="p">.</span><span class="nx">events</span><span class="p">.</span><span class="nx">retrieve</span><span class="p">({</span>
    <span class="nx">queue_id</span><span class="o">:</span> <span class="nx">res</span><span class="p">.</span><span class="nx">queue_id</span><span class="p">,</span>
    <span class="nx">last_event_id</span><span class="o">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
    <span class="nx">dont_block</span><span class="o">:</span> <span class="kc">false</span>
  <span class="p">}).</span><span class="nx">then</span><span class="p">(</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">);</span>
<span class="p">});</span>
</pre></div>

</div>
    <p>&nbsp;</p>

    <h3>API Keys</h3>
    <a name="api_keys"></a>
    <p>You can create bots on your <a href="/#settings" target="_blank">settings page</a>.
    Once you have a bot, you can use its email and API key to send messages.</p>

    <p>Create a bot:</p>
    <img class="screenshot" src="/static/images/api/create-bot.png" />

    <p>Look for the bot's email and API key:
    <img class="screenshot" src="/static/images/api/bot-key.png" /></p>

    <p>If you prefer to send messages as your own user, you can also find your API key on your <a href="/#settings" target="_blank">settings page</a>.</p>
    <p>When using our python bindings, you may either specify the user
    and API key for each Client object that you initialize, or let the binding look for
    them in your <code>~/.zuliprc</code>, which you can create as follows:</p>
<div class="codehilite"><pre><span class="k">[api]</span>
<span class="na">key</span><span class="o">=</span><span class="s">BOT_API_KEY</span>
<span class="na">email</span><span class="o">=</span><span class="s">BOT_EMAIL_ADDRESS</span>
{% if api_site_required %}<span class="na">site</span><span class="o">=</span><span class="s">{{ external_api_uri_subdomain }}</span>{% endif %}</pre></div>
</div>
{% endblock %}
