curl --request POST \
--url https://api.ionworks.com/integrations/uncountable/sync \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": false
}
'import requests
url = "https://api.ionworks.com/integrations/uncountable/sync"
payload = {
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": False
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({project_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', dry_run: false})
};
fetch('https://api.ionworks.com/integrations/uncountable/sync', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/integrations/uncountable/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'project_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'dry_run' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/integrations/uncountable/sync"
payload := strings.NewReader("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ionworks.com/integrations/uncountable/sync")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/integrations/uncountable/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"uncountable_project_ids": [
123
],
"recipes_read": 123,
"recipes_skipped": 123,
"specs_created": 123,
"specs_existing": 123,
"instances_created": 123,
"instances_existing": 123,
"specs": [
{
"id": "<string>",
"name": "<string>",
"created": true,
"instances_created": 123,
"instances_existing": 123,
"conflicts": {},
"gaps": {},
"design": {},
"drift": {},
"instances": [
{
"name": "<string>",
"notes": "<string>",
"exists": true,
"measured_properties": {},
"id": "<string>",
"moved_from": "<string>"
}
]
}
],
"refused": [
"<string>"
],
"recipes_refused": 0,
"dry_run": false,
"mapping": [
{
"source": "<string>",
"target": "<string>",
"input_ids": [
123
],
"note": ""
}
],
"unmapped_inputs": [
{
"input_id": 123,
"name": "<string>",
"recipes": 123
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Create cell specifications and instances from Uncountable recipes
Read the organization’s Uncountable project and create what is missing.
Callable with an API key (X-API-Key) as well as a session, so a scheduler
can run it. Idempotent: specifications are matched by name within the project
and instances by recipe id within their specification, and existing records
are left unchanged. With dry_run it writes nothing and reports what it
would create, with the field mapping. Answers 403 unless the organization’s
nav_config.uncountableSync is enabled and names its projects.
curl --request POST \
--url https://api.ionworks.com/integrations/uncountable/sync \
--header 'Content-Type: application/json' \
--data '
{
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": false
}
'import requests
url = "https://api.ionworks.com/integrations/uncountable/sync"
payload = {
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dry_run": False
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({project_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', dry_run: false})
};
fetch('https://api.ionworks.com/integrations/uncountable/sync', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/integrations/uncountable/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'project_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'dry_run' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/integrations/uncountable/sync"
payload := strings.NewReader("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ionworks.com/integrations/uncountable/sync")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/integrations/uncountable/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"uncountable_project_ids": [
123
],
"recipes_read": 123,
"recipes_skipped": 123,
"specs_created": 123,
"specs_existing": 123,
"instances_created": 123,
"instances_existing": 123,
"specs": [
{
"id": "<string>",
"name": "<string>",
"created": true,
"instances_created": 123,
"instances_existing": 123,
"conflicts": {},
"gaps": {},
"design": {},
"drift": {},
"instances": [
{
"name": "<string>",
"notes": "<string>",
"exists": true,
"measured_properties": {},
"id": "<string>",
"moved_from": "<string>"
}
]
}
],
"refused": [
"<string>"
],
"recipes_refused": 0,
"dry_run": false,
"mapping": [
{
"source": "<string>",
"target": "<string>",
"input_ids": [
123
],
"note": ""
}
],
"unmapped_inputs": [
{
"input_id": 123,
"name": "<string>",
"recipes": 123
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Body
Response
Successful Response
Uncountable projects read.
Distinct recipes across the Uncountable projects.
Full-cell recipes skipped because they have no inputs yet.
New cell specifications.
Cell specifications reused.
New cell instances.
Cell instances left unchanged.
Per-spec breakdown.
Show child attributes
Show child attributes
Recipes and designs that could not be mapped without guessing (two slurries for one electrode, or no design capacity), and why. Nothing is created for them. One entry can stand for a whole design.
Recipes behind the refusals, counting every recipe of a design.
True when nothing was written: the counts are a preview.
How Uncountable fields land in Ionworks.
Show child attributes
Show child attributes
Inputs the full-cell recipes state that are not imported.
Show child attributes
Show child attributes
Was this page helpful?