curl --request POST \
--url https://app.teampascal.com/api/v1/custom-source/uploads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": false
}
'import requests
url = "https://app.teampascal.com/api/v1/custom-source/uploads"
payload = {
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({datasource: '<string>', doc_type: '<string>', dry_run: false})
};
fetch('https://app.teampascal.com/api/v1/custom-source/uploads', 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://app.teampascal.com/api/v1/custom-source/uploads",
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([
'datasource' => '<string>',
'doc_type' => '<string>',
'dry_run' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://app.teampascal.com/api/v1/custom-source/uploads"
payload := strings.NewReader("{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.teampascal.com/api/v1/custom-source/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.teampascal.com/api/v1/custom-source/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": true,
"mode": "<string>",
"status": "in_progress",
"upload_id": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}Open an upload
Open an upload scoped to one declared document type. Record IDs must be unique across the datasource. Full uploads delete missing records only within this type and move every submitted record ID to this type. Dry runs do not evaluate the deletion brake. An undeclared document type returns HTTP 400 with error.code = undeclared_doc_type and error.details containing doc_type and reason.
curl --request POST \
--url https://app.teampascal.com/api/v1/custom-source/uploads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": false
}
'import requests
url = "https://app.teampascal.com/api/v1/custom-source/uploads"
payload = {
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({datasource: '<string>', doc_type: '<string>', dry_run: false})
};
fetch('https://app.teampascal.com/api/v1/custom-source/uploads', 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://app.teampascal.com/api/v1/custom-source/uploads",
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([
'datasource' => '<string>',
'doc_type' => '<string>',
'dry_run' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://app.teampascal.com/api/v1/custom-source/uploads"
payload := strings.NewReader("{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.teampascal.com/api/v1/custom-source/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.teampascal.com/api/v1/custom-source/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"datasource\": \"<string>\",\n \"doc_type\": \"<string>\",\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"datasource": "<string>",
"doc_type": "<string>",
"dry_run": true,
"mode": "<string>",
"status": "in_progress",
"upload_id": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Declared document type for every record in this upload. invoice and purchase_order are mapped types; other names must match ^[a-z][a-z0-9_]{2,40}$. Custom types are stored for Pascal-side processing and are not searchable. Record IDs are unique across all doc types in a datasource; re-sending an ID under a different type moves the record to that type.
incremental, full 
