curl --request POST \
--url https://api.croma.run/global/extract/markdown/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304"
}
'import requests
url = "https://api.croma.run/global/extract/markdown/v1"
payload = { "url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304" }
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({url: 'https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304'})
};
fetch('https://api.croma.run/global/extract/markdown/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/global/extract/markdown/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([
'url' => 'https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304'
]),
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/global/extract/markdown/v1"
payload := strings.NewReader("{\n \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\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/global/extract/markdown/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/global/extract/markdown/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 \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"url": "<string>",
"markdown": "<string>",
"metadata": {
"title": "<string>",
"author": "<string>",
"published_at": "<string>",
"image": "<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": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}Turn any public web page into clean Markdown. scope keeps either the article body or the whole page, and include_metadata adds the page’s title, author, published date and image. Handles pages that render themselves in the browser at effort: max.
curl --request POST \
--url https://api.croma.run/global/extract/markdown/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304"
}
'import requests
url = "https://api.croma.run/global/extract/markdown/v1"
payload = { "url": "https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304" }
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({url: 'https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304'})
};
fetch('https://api.croma.run/global/extract/markdown/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/global/extract/markdown/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([
'url' => 'https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304'
]),
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/global/extract/markdown/v1"
payload := strings.NewReader("{\n \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\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/global/extract/markdown/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/global/extract/markdown/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 \"url\": \"https://www.funcionpublica.gov.co/eva/gestornormativo/norma.php?i=304\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"url": "<string>",
"markdown": "<string>",
"metadata": {
"title": "<string>",
"author": "<string>",
"published_at": "<string>",
"image": "<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": {}
}
}{
"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"
Body
Public http or https URL of the page to read. Loopback and private addresses are not accepted.
2000main keeps the article body and drops navigation and boilerplate; full keeps the whole page.
main, full Effort to spend on the page: min is fastest and may serve a recent copy, standard is the balanced default, max always reads the page live and handles pages that render themselves in the browser.
min, standard, max Include the page's title, author, published date and image in the response.
Response
Successful response
Show child attributes
Show child attributes