blob: d01fa6a101ce6a810a9a486fb29af00af56358d5 [file] [log] [blame]
---
active_crumb: REST API
layout: documentation
id: rest
---
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div class="col-md-8 second-column">
<section id="overview">
<h2 class="section-title">Overview</h2>
<p>
REST API provides a universal integration path for any type of user application to connect to and use NLPCraft.
By using REST API these applications can ask natural language questions, get results and perform
many supporting operations such as user management.
</p>
<p>
REST server accepts the REST call,
interprets and routes it to the appropriate data probe which in turn invokes one of its deployed
data models. The result of data model processing travels all the way through the same chain of components
back to the user application that made the original call.
</p>
<div class="bq info">
<p>
If you downloaded ZIP archive the REST API specification is also available in
<code>openapi/nlpcraft_swagger.yml</code> file
or on <a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml">GitHub</a>.
</p>
</div>
</section>
<section id="java-client">
<h3 class="section-title">Java Client <i class="fab fa-java"></i></h3>
<p>
NLPCraft provide native Java client that enables easy-to-use Java-based API wrapping standard
NLPCraft REST APIs. It can be used by any JVM language that provides Java interop such as Scala, Groovy, or Kotlin:
</p>
<ul>
<li>Maven/Grape/Gradle/SBT <a href="download.html#java-client">instructions</a></li>
<li>Latest <a target=_ href="https://nlpcraft.apache.org/apis/java-client/latest/index.html">Javadoc</a></li>
<li>Watch, star or fork <a target="github" href="https://github.com/apache/incubator-nlpcraft-java-client">GitHub Project</a></li>
</ul>
</section>
<section id="format">
<h3 class="section-title">REST URL</h3>
<p>
REST API accepts only <code>POST</code> HTTP calls and <code>application/json</code> content type
for JSON payload and responses. When issuing a REST call you will be using the following URL:
</p>
<pre class="brush: plain">
https://localhost:8081/api/v1/signin
</pre>
<p>
where:
<dl>
<dt><code>http</code></dt>
<dd>Either <code>http</code> or <code>https</code> protocol.</dd>
<dt><code>localhost:8081</code></dt>
<dd>Host and port on which REST server is started. <code>localhost:8081</code> is the default configuration and can be <a href="server-and-probe.html">changed</a>.</dd>
<dt><code>/api/v1</code></dt>
<dd>Mandatory prefix indicating API version.</dd>
<dt><code>/signin</code></dt>
<dd>Specific REST call.</dd>
</dl>
<div class="bq info">
<p>
<b>bin/nccurl.sh</b>
</p>
<p>
<a target="wiki" href="https://en.wikipedia.org/wiki/CURL">cURL</a> is an excellent utility for testing REST services from the command line and scripts.
NLPCraft comes with a convenient wrapper script <code>bin/nccurl.sh</code> that shortens
command line of the standard cURL. We recommend adding <code>bin/nccurl.sh</code> to your
<code>$PATH</code> environment variable.
</p>
</div>
<p>
REST API is divided into five functional groups:
</p>
<ul>
<li><a href="#auth">Authentication</a></li>
<li><a href="#asking">Asking</a></li>
<li><a href="#company">Company Management</a></li>
<li><a href="#user">User Management</a></li>
<li><a href="#data_probe">Data Probe Management</a></li>
</ul>
<div class="bq info">
<b>Admins</b>
<p>
Note that many operations are only available to the users with administrative privileges. Note
also that some operations will implicitly behave differently based on whether the currently signed in user
have administrative privileges or not.
</p>
</div>
<div class="bq info">
<b>External User ID</b>
<p>
Many calls on REST API accept external "on-behalf-of" user ID (<code>usrExtId</code>) additionally to the regular
user ID (<code>usrID</code>). In these methods zero, one or both IDs must be provided. If none are provided
the ID of the currently signed in user will be used. If both are provided they should point to the same user.
External user ID allows to use user identification from the external systems without a need to import all the
existing users into NLPCraft in the first place.
</p>
<p>
Typical usage pattern for integrating NLPCraft into existing
system is to create a single administrative NLPCraft user, sign in with that account and then use external
"on-behalf-of" user IDs in all the requests. This way you get the same functionality as if using ordinary
user IDs but without a need to migrate and synchronize all user accounts from the existing system to NLPCraft.
</p>
</div>
</section>
<section id="auth">
<h3 class="section-title">Authentication</h3>
<p>
Before performing any REST calls a registered user needs to sign in to receive
an <b>access token</b> that will be used in all subsequent operations:
</p>
<table class="gradient-table">
<thead>
<tr>
<th>REST call</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/signin</code></nobr></a></td>
<td>Sign in and obtain <b>access token</b>.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/signout</code></nobr></a></td>
<td>Sign out and invalidate previously obtained <b>access token</b>.</td>
</tr>
</tbody>
</table>
<div class="bq info">
<b>Default User</b>
<p>
NLPCraft comes with a default built-in credentials that you can use when signing in for the
first time:
</p>
<ul>
<li>Email: <code>admin@admin.com</code></li>
<li>Password: <code>admin</code></li>
</ul>
</div>
<div class="bq warn">
<p>
In production environment make sure to delete this default user once you add at least one of your
own users with administrative privileges.
</p>
</div>
</section>
<section id="asking">
<h3 class="section-title">Asking</h3>
<p>
This is the main group of operation that allows to ask questions, check the status and get
result:
</p>
<table class="gradient-table">
<thead>
<tr>
<th>REST call</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/ask</code></nobr></a></td>
<td>Submit the sentence to be processed <b>asynchronously</b>.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/ask/sync</code></nobr></a></td>
<td>Submit the sentence to be processed <b>synchronously</b>. </td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/check</code></nobr></a></td>
<td>Get statuses and results for previously submitted <code>/ask</code> requests.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/cancel</code></nobr></a></td>
<td>
Remove results from the server memory.
</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/clear/conversation</code></nobr></a></td>
<td>
Clear the conversation STM for current user and data model.
</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/clear/dialog</code></nobr></a></td>
<td>
Clear the dialog flow for current user and data model.
</td>
</tr>
</tbody>
</table>
</section>
<section id="company">
<h3 class="section-title">Company Management</h3>
<p>
This group of operations allows to add, update and remove companies in the systems.
</p>
<table class="gradient-table">
<thead>
<tr>
<th>REST call</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/company/get</code></nobr></a></td>
<td>Gets current user company.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/company/add</code></nobr></a></td>
<td>Add new company.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/company/update</code></nobr></a></td>
<td>Update company information.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/company/delete</code></nobr></a></td>
<td>Delete company.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/company/token/reset</code></nobr></a></td>
<td>Reset company's authentication token.</td>
</tr>
</tbody>
</table>
</section>
<section id="user">
<h3 class="section-title">User Management</h3>
<p>
This group of operations allows to add, update and remove users in the systems:
</p>
<table class="gradient-table">
<thead>
<tr>
<th>REST call</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/get</code></nobr></a></td>
<td>Get current user information.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/all</code></nobr></a></td>
<td>Get all users.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/add</code></nobr></a></td>
<td>Add new user.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/update</code></nobr></a></td>
<td>Update user information.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/delete</code></nobr></a></td>
<td>Delete user.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/admin</code></nobr></a></td>
<td>Change user administrative privileges.</td>
</tr>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/user/passwd/reset</code></nobr></a></td>
<td>
Reset the current user password.
</td>
</tr>
</tbody>
</table>
</section>
<section id="data_probe">
<h3 class="section-title">Data Probe Management</h3>
<p>
This group of operations allows to get the information about connected data probes:
</p>
<table class="gradient-table">
<thead>
<tr>
<th>REST call</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a target="github" href="https://github.com/apache/incubator-nlpcraft/blob/master/openapi/nlpcraft_swagger.yml"><nobr><code>/probes/all</code></nobr></a></td>
<td>Get information about connected probes.</td>
</tr>
</tbody>
</table>
</section>
<section id="server_errors">
<h2 class="section-title">Server Errors</h2>
<p>
When REST server returns HTTP error the response body contains JSON object (<code>Content-Type → application/json</code>)
with two fields <code>code</code> and <code>msg</code>:
</p>
<pre class="brush: js">
{
"code": "NC_INVALID_ACCESS_TOKEN",
"msg": "Unknown access token: PPdxjwXBOIMpAWNgpKq1"
}
</pre>
<p>
Following tables shows all possible <code>code</code> values for these server errors:
</p>
<table class="gradient-table">
<thead>
<tr>
<th>Code</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>NC_INVALID_ACCESS_TOKEN</code></td>
<td>
The access token is invalid or no longer valid. Note that previously issued existing access
tokens can expire or be otherwise invalidated and have to be obtained again.
</td>
</tr>
<tr>
<td><code>NC_SIGNIN_FAILURE</code></td>
<td>
Invalid or unknown user email and/or user password during <code>/signin</code> call. This can
indicate either the attempt to signin by the user that hasn't been added yet, or the invalid
password for the existing user.
</td>
</tr>
<tr>
<td><code>NC_NOT_IMPLEMENTED</code></td>
<td>
Particular feature is not implemented yet or not available. This is reserved for API extensions and
future backward compatibility.
</td>
</tr>
<tr>
<td><code>NC_INVALID_FIELD</code></td>
<td>
This indicated a problem with a field. It's either too bit, too small, empty or otherwise invalid.
See <code>msg</code> field in the error response for details.
</td>
</tr>
<tr>
<td><code>NC_ADMIN_REQUIRED</code></td>
<td>
Calling user is required to have admin privileges to execute given call.
</td>
</tr>
<tr>
<td><code>NC_INVALID_OPERATION</code></td>
<td>
Indicates that a given operation cannot be performed as specified. For example, this error
is returned when you attempt to remove or revoke admin privileges from the
last admin user.
</td>
</tr>
<tr>
<td><code>NC_ERROR</code></td>
<td>Indicates a general server error.</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="col-md-2 third-column">
<ul class="side-nav">
<li class="side-nav-title">On This Page</li>
<li><a href="#format">REST URL</a></li>
<li><a href="#auth">Authentication</a></li>
<li><a href="#company">Company</a></li>
<li><a href="#user">Users</a></li>
<li><a href="#asking">Asking</a></li>
<li><a href="#data_probe">Data Probes</a></li>
<li><a href="#server_errors">Server Errors</a></li>
{% include quick-links.html %}
</ul>
</div>