Text & Transforms

14 endpoints for text manipulation, data transformation, and formatting tasks.

Endpoint Purpose
POST /v1/diff Compute a unified diff between two text strings
POST /v1/slug Convert text to a URL-friendly slug
POST /v1/word-count Count words, characters, sentences, and paragraphs
POST /v1/sql-format Format and pretty-print a SQL query
POST /v1/text-escape Escape or unescape text (shell, regex, JSON, SQL, XML)
POST /v1/text-truncate Truncate text to a maximum length
POST /v1/code-format Format source code (Python, JSON, XML, HTML, SQL)
POST /v1/liquid-render Render a Liquid template with variables
POST /v1/json-transform Transform JSON with a JMESPath expression
POST /v1/math-eval Evaluate a mathematical expression
POST /v1/date-format Parse, format, and convert dates between timezones
POST /v1/json-flatten Flatten or unflatten a nested JSON object
POST /v1/array-ops Sort, unique, intersect, diff, union, chunk arrays
POST /v1/number-format Format a number (decimal, currency, percent, scientific)

REST API Examples

Compute a unified diff

curl -X POST "https://dev.toolkitapi.io/v1/diff" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"a": "Hello world\nLine two", "b": "Hello world\nLine 2\nNew line"}'
const resp = await fetch("https://dev.toolkitapi.io/v1/diff", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    a: "Hello world\nLine two",
    b: "Hello world\nLine 2\nNew line",
  }),
});
const data = await resp.json();
console.log(data.unified);
Response
{
  "unified": "@@ -1,2 +1,3 @@\n Hello world\n-Line two\n+Line 2\n+New line",
  "added": 2,
  "removed": 1,
  "changed": 1
}

Slugify text

curl -X POST "https://dev.toolkitapi.io/v1/slug" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello World! This is a Test.", "separator": "-", "max_length": 30}'
const resp = await fetch("https://dev.toolkitapi.io/v1/slug", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ text: "Hello World!", separator: "-", max_length: 30 }),
});
const data = await resp.json();
console.log(data.slug); // "hello-world"

Evaluate a math expression

curl -X POST "https://dev.toolkitapi.io/v1/math-eval" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expression": "sqrt(16) + pow(2, 3) - abs(-5)"}'
const resp = await fetch("https://dev.toolkitapi.io/v1/math-eval", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ expression: "sqrt(16) + pow(2, 3)" }),
});
const data = await resp.json();
console.log(`Result: ${data.result}`);

Format a SQL query

curl -X POST "https://dev.toolkitapi.io/v1/sql-format" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sql": "select id,name,email from users where active=1 order by name desc", "uppercase": true}'
const resp = await fetch("https://dev.toolkitapi.io/v1/sql-format", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ sql: "select * from users", uppercase: true }),
});
const data = await resp.json();
console.log(data.formatted);

Transform JSON with JMESPath

curl -X POST "https://dev.toolkitapi.io/v1/json-transform" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expression": "products[?price > `10`].name", "data": {"products": [{"name": "A", "price": 5}, {"name": "B", "price": 15}]}}'
const resp = await fetch("https://dev.toolkitapi.io/v1/json-transform", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    expression: "products[?price > `10`].name",
    data: { products: [{ name: "A", price: 5 }, { name: "B", price: 15 }] },
  }),
});
const data = await resp.json();
console.log(data.result); // ["B"]

Python SDK Examples

Compute a unified diff

from toolkitapi import DevTools

original = "Hello world\nThis is line two\nThis is line three"
modified = "Hello world\nThis is line 2\nThis is line three\nNew line added"

with DevTools(api_key="tk_...") as dt:
    result = dt.diff(original, modified)
    print(result["unified"])    # Unified diff output
    print(result["added"])      # Number of added lines
    print(result["removed"])    # Number of removed lines

Slugify text

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    result = dt.slug("Hello World! This is a Test.", separator="-", max_length=30)
    print(result["slug"])   # "hello-world-this-is-a-test"

Count words and characters

from toolkitapi import DevTools

text = "The quick brown fox jumps over the lazy dog. Pack my box with five dozen liquor jugs."

with DevTools(api_key="tk_...") as dt:
    result = dt.word_count(text)
    print(result["words"])       # 16
    print(result["characters"])  # 86 (with spaces)
    print(result["sentences"])   # 2
    print(result["paragraphs"])  # 1
    print(result["read_time"])   # "< 1 min"

Format a SQL query

from toolkitapi import DevTools

sql = "select u.id,u.name,o.total from users u inner join orders o on u.id=o.user_id where u.active=1 order by o.total desc"

with DevTools(api_key="tk_...") as dt:
    result = dt.sql_format(sql, indent=2, uppercase=True)
    print(result["formatted"])
    # SELECT
    #   u.id,
    #   u.name,
    #   o.total
    # FROM users u
    # INNER JOIN orders o ON u.id = o.user_id
    # WHERE u.active = 1
    # ORDER BY o.total DESC

Escape text for different contexts

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    # Escape for shell
    result = dt.text_escape("Hello; rm -rf /", context="shell")
    print(result["escaped"])

    # Escape for SQL
    result = dt.text_escape("O'Brien's café", context="sql")
    print(result["escaped"])

    # Unescape JSON
    result = dt.text_escape(r'Hello \"world\"', context="json", unescape=True)
    print(result["escaped"])

Truncate text

from toolkitapi import DevTools

long_text = "The quick brown fox jumps over the lazy dog and continues running."

with DevTools(api_key="tk_...") as dt:
    result = dt.text_truncate(long_text, max_length=30, word_boundary=True)
    print(result["truncated"])  # "The quick brown fox jumps..."
    print(result["truncated"])  # Always ends at a word boundary

Format source code

from toolkitapi import DevTools

messy_python = "def   hello(name):   print(  'hello '+name   )"

with DevTools(api_key="tk_...") as dt:
    result = dt.code_format(messy_python, language="python")
    print(result["formatted"])

Render a Liquid template

from toolkitapi import DevTools

template = "Hello, {{ name }}! You have {{ count }} new {{ count | pluralize: 'message', 'messages' }}."

with DevTools(api_key="tk_...") as dt:
    result = dt.liquid_render(
        template,
        variables={"name": "Alice", "count": 3},
    )
    print(result["output"])   # "Hello, Alice! You have 3 new messages."

Transform JSON with JMESPath

from toolkitapi import DevTools

data = {
    "people": [
        {"name": "Alice", "age": 30, "active": True},
        {"name": "Bob",   "age": 25, "active": False},
        {"name": "Carol", "age": 35, "active": True},
    ]
}

with DevTools(api_key="tk_...") as dt:
    result = dt.json_transform(data, "people[?active].name")
    print(result["result"])   # ["Alice", "Carol"]

Evaluate a math expression

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    result = dt.math_eval("round(sqrt(price * quantity), 2)", variables={"price": 19.99, "quantity": 7})
    print(result["result"])   # 11.83

Format and convert dates

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    result = dt.date_format(
        "2024-06-15 09:30:00",
        input_format="%Y-%m-%d %H:%M:%S",
        output_format="%B %d, %Y at %I:%M %p",
        from_timezone="US/Eastern",
        to_timezone="UTC",
    )
    print(result["formatted"])   # "June 15, 2024 at 01:30 PM"

Flatten a nested JSON object

from toolkitapi import DevTools

nested = {
    "user": {
        "name": "Alice",
        "address": {
            "city": "London",
            "postcode": "SW1A 1AA",
        },
    }
}

with DevTools(api_key="tk_...") as dt:
    result = dt.json_flatten(nested, separator=".")
    print(result["data"])
    # {
    #   "user.name": "Alice",
    #   "user.address.city": "London",
    #   "user.address.postcode": "SW1A 1AA"
    # }

    # Unflatten it back
    result = dt.json_flatten(result["data"], direction="unflatten")
    print(result["data"])

Array operations

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    # Get unique values
    result = dt.array_ops("unique", [[1, 2, 2, 3, 3, 4]])
    print(result["result"])   # [1, 2, 3, 4]

    # Intersect two arrays
    result = dt.array_ops("intersect", [[1, 2, 3, 4], [3, 4, 5, 6]])
    print(result["result"])   # [3, 4]

    # Chunk into groups of 3
    result = dt.array_ops("chunk", [[1, 2, 3, 4, 5, 6, 7]], options={"chunk_size": 3})
    print(result["result"])   # [[1, 2, 3], [4, 5, 6], [7]]

Format a number

from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    result = dt.number_format(1234567.89, locale="en_US", format_type="currency", currency="USD")
    print(result["formatted"])   # "$1,234,567.89"

    result = dt.number_format(0.1234, format_type="percent", precision=1)
    print(result["formatted"])   # "12.3%"

Tip

Combine json-transform (JMESPath) with json-flatten to reshape and normalise complex API responses before inserting them into a database or sending to a downstream service.