
Apacta
Last updated: March 6, 2023
Description
API for a tool to craftsmen used to register working hours, material usage and quality assurance.
Endpoint
The endpoint https://app.apacta.com/api/v1
should be used to communicate with the API. API access is only allowed with SSL encrypted connection (https).
Authentication
URL query authentication with an API key is used, so appending ?api_key={api_key}
to the URL where {api_key}
is found within Apacta settings is used for authentication
Pagination
If the endpoint returns a pagination
object it means the endpoint supports pagination - currently it's only possible to change pages with ?page={page_number}
but implementing custom page sizes are on the road map.
Search/filter
Is experimental but implemented in some cases - see the individual endpoints' docs for further explanation.
Ordering
Is currently experimental, but on some endpoints it's implemented on URL querys so eg. to order Invoices by invoice_number
appending ?sort=Invoices.invoice_number&direction=desc
would sort the list descending by the value of invoice_number
.
Associations
Is currently implemented on an experimental basis where you can append eg. ?include=Contacts,Projects
to the /api/v1/invoices/
endpoint to embed Contact
and Project
objects directly.
Project Files
Currently project files can be retrieved from two endpoints. /projects/{project_id}/files
handles files uploaded from wall posts or forms. /projects/{project_id}/project_files
allows uploading and showing files, not belonging to specific form or wall post.
Errors/Exceptions
422 (Validation)
Write something about how the errors
object contains keys with the properties that failes validation like:
{
"success": false,
"data": {
"code": 422,
"url": "/api/v1/contacts?api_key=5523be3b-30ef-425d-8203-04df7caaa93a",
"message": "A validation error occurred",
"errorCount": 1,
"errors": {
"contact_types": [ ## Property name that failed validation
"Contacts must have at least one contact type" ## Message with further explanation
]
}
}
}
Code examples
Running examples of how to retrieve the 5 most recent forms registered and embed the details of the User that made the form, and eventual products contained in the form
Swift
Java
OkHttp
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5")
.get()
.addHeader("x-auth-token", "{INSERT_YOUR_TOKEN}")
.addHeader("accept", "application/json")
.build();
Response response = client.newCall(request).execute();
Unirest
HttpResponse<String> response = Unirest.get("https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5")
.header("x-auth-token", "{INSERT_YOUR_TOKEN}")
.header("accept", "application/json")
.asString();
Javascript
Native
var data = null;
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5");
xhr.setRequestHeader("x-auth-token", "{INSERT_YOUR_TOKEN}");
xhr.setRequestHeader("accept", "application/json");
xhr.send(data);
jQuery
var settings = {
"async": true,
"crossDomain": true,
"url": "https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5",
"method": "GET",
"headers": {
"x-auth-token": "{INSERT_YOUR_TOKEN}",
"accept": "application/json",
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
NodeJS (Request)
var request = require("request");
var options = { method: 'GET',
url: 'https://app.apacta.com/api/v1/forms',
qs:
{ extended: 'true',
sort: 'Forms.created',
direction: 'DESC',
include: 'Products,CreatedBy',
limit: '5' },
headers:
{ accept: 'application/json',
'x-auth-token': '{INSERT_YOUR_TOKEN}' } };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
Python 3
import http.client
conn = http.client.HTTPSConnection("app.apacta.com")
payload = ""
headers = {
'x-auth-token': "{INSERT_YOUR_TOKEN}",
'accept': "application/json",
}
conn.request("GET", "/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
C#
RestSharp
var client = new RestClient("https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5");
var request = new RestRequest(Method.GET);
request.AddHeader("accept", "application/json");
request.AddHeader("x-auth-token", "{INSERT_YOUR_TOKEN}");
IRestResponse response = client.Execute(request);
Ruby
require 'uri'
require 'net/http'
url = URI("https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
request["x-auth-token"] = '{INSERT_YOUR_TOKEN}'
request["accept"] = 'application/json'
response = http.request(request)
puts response.read_body
PHP (HttpRequest)
<?php
$request = new HttpRequest();
$request->setUrl('https://app.apacta.com/api/v1/forms');
$request->setMethod(HTTP_METH_GET);
$request->setQueryData(array(
'extended' => 'true',
'sort' => 'Forms.created',
'direction' => 'DESC',
'include' => 'Products,CreatedBy',
'limit' => '5'
));
$request->setHeaders(array(
'accept' => 'application/json',
'x-auth-token' => '{INSERT_YOUR_TOKEN}'
));
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}
Shell (cURL)
$ curl --request GET --url 'https://app.apacta.com/api/v1/forms?extended=true&sort=Forms.created&direction=DESC&include=Products%2CCreatedBy&limit=5' --header 'accept: application/json' --header 'x-auth-token: {INSERT_YOUR_TOKEN}'