curl --request POST \
--url https://api.croma.run/co/dian/electronic-document/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cufe": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"document_number": "900123456"
}
'import requests
url = "https://api.croma.run/co/dian/electronic-document/v1"
payload = {
"cufe": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"document_number": "900123456"
}
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({
cufe: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
document_number: '900123456'
})
};
fetch('https://api.croma.run/co/dian/electronic-document/v1', 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.croma.run/co/dian/electronic-document/v1",
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([
'cufe' => '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
'document_number' => '900123456'
]),
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://api.croma.run/co/dian/electronic-document/v1"
payload := strings.NewReader("{\n \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\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://api.croma.run/co/dian/electronic-document/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/co/dian/electronic-document/v1")
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 \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"found": true,
"cufe": "<string>",
"document_type": "<string>",
"series": "<string>",
"folio": "<string>",
"issue_date": "<string>",
"issuer": {
"nit": "<string>",
"name": "<string>"
},
"recipient": {
"nit": "<string>",
"name": "<string>"
},
"total": 123,
"taxes": [
{
"name": "<string>",
"value": 123
}
],
"legitimate_holder": "<string>",
"pdf_url": "<string>",
"validations": [
{
"name": "<string>",
"result": "<string>",
"detail": "<string>"
}
],
"events": [
{
"code": "<string>",
"name": "<string>",
"date": "<string>",
"issuer": {
"nit": "<string>",
"name": "<string>"
},
"recipient": {
"nit": "<string>",
"name": "<string>"
},
"cude": "<string>",
"description": "<string>"
}
]
}
}{
"job": {
"id": "<string>",
"status": "queued",
"endpoint": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"status_url": "<string>"
},
"data": {},
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}DIAN Electronic Document
Validate a Colombian electronic document (factura electrónica, nota crédito/débito) by its CUFE/UUID and the emisor or receptor NIT. Returns the issuer, recipient, totals and taxes (whole pesos, as the registry publishes them), current legitimate holder, validations, and events, each with its code (030, 032, 033…), name, date and parties. Set include_pdf: true to also receive pdf_url, the URL of the official PDF representation. A result is reused for 24 hours; pass cache: false to read the registry again, for instance after filing an event. found: false means the document is not registered under that CUFE, or the NIT matches neither the emisor nor the receptor.
Supports async delivery: set Prefer: wait=N for an inline result, pass callback_url to receive a POST when ready, or poll GET /jobs/{id}.
curl --request POST \
--url https://api.croma.run/co/dian/electronic-document/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cufe": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"document_number": "900123456"
}
'import requests
url = "https://api.croma.run/co/dian/electronic-document/v1"
payload = {
"cufe": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"document_number": "900123456"
}
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({
cufe: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
document_number: '900123456'
})
};
fetch('https://api.croma.run/co/dian/electronic-document/v1', 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.croma.run/co/dian/electronic-document/v1",
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([
'cufe' => '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
'document_number' => '900123456'
]),
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://api.croma.run/co/dian/electronic-document/v1"
payload := strings.NewReader("{\n \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\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://api.croma.run/co/dian/electronic-document/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/co/dian/electronic-document/v1")
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 \"cufe\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n \"document_number\": \"900123456\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"found": true,
"cufe": "<string>",
"document_type": "<string>",
"series": "<string>",
"folio": "<string>",
"issue_date": "<string>",
"issuer": {
"nit": "<string>",
"name": "<string>"
},
"recipient": {
"nit": "<string>",
"name": "<string>"
},
"total": 123,
"taxes": [
{
"name": "<string>",
"value": 123
}
],
"legitimate_holder": "<string>",
"pdf_url": "<string>",
"validations": [
{
"name": "<string>",
"result": "<string>",
"detail": "<string>"
}
],
"events": [
{
"code": "<string>",
"name": "<string>",
"date": "<string>",
"issuer": {
"nit": "<string>",
"name": "<string>"
},
"recipient": {
"nit": "<string>",
"name": "<string>"
},
"cude": "<string>",
"description": "<string>"
}
]
}
}{
"job": {
"id": "<string>",
"status": "queued",
"endpoint": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"status_url": "<string>"
},
"data": {},
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}Authorizations
Use Authorization: Bearer YOUR_API_KEY
Headers
Optional client-chosen key for this request (any string up to 255 characters, e.g. a UUID). Every Croma operation is an idempotent lookup: repeating a request with the same body returns the same result and creates nothing, so retrying after a timeout or network failure is always safe. The key is echoed back in the Idempotency-Key response header so you can correlate a retry with its first attempt. Each attempt that reaches the API counts against the rate limit.
255"0f8e9a42-6b7c-4d1e-9a3f-2c5d7e8f9a0b"
Set wait=N to hold the connection up to N seconds for an inline result. If the job finishes in time you get the normal 200 body; otherwise a 202 with a status_url to poll.
"wait=30"
Body
CUFE/CUDE (unique electronic-document code) or UUID of the document.
30 - 100^[A-Za-z0-9-]{30,100}$Colombian NIT (numeric, no verification digit). 4-15 digits.
4 - 15^\d{4,15}$When true, the response includes pdf_url, the URL of the official PDF representation of the document.
Set to false to skip any stored result for this lookup and read the source again. The fresh answer replaces the stored one and is charged as a new request. Default true.
POST the job result here when it finishes.
Response
Successful response
Show child attributes
Show child attributes