ಕೊನೆಯ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ: 8 September, 2026

Base URL: /apiLight task — 10 req/min per IPHeavy task — 5 req/min per IP

Public API Documentation

Public, unauthenticated API for lightweight file processing and lookups. No API key required.

Base URL

https://newisty.com/api

All responses are JSON unless noted (binary endpoints return raw file bytes).

Rate Limits

Per IP address, combined with a normalized User-Agent (clients rotating User-Agents do not share the same quota bucket):

Tier Limit
Light task 10 requests / minute
Heavy task 5 requests / minute

Exceeding the limit returns 429 Too Many Requests with Retry-After header.

Security Headers

Every public API response includes:

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: no-referrer
Cache-Control: no-store

Response Format

Standard envelope (JSON endpoints):

{
  "status": true,
  "message": "Success",
  "data": { },
  "meta": null
}

Errors:

{
  "status": false,
  "message": "Error message",
  "data": null
}

422 = validation/processing error, 404 = not found, 429 = rate limited, 503 = upstream failure.



Image

POST /api/image/process

Resize / compress / convert images. Max 10 MB per file.

Rate: Light task — multipart/form-data

Param Type Required Description
images file[] one of Image files (jpg, jpeg, png, gif, webp, jiff, bmp)
urls string one of Newline-separated image URLs
width integer yes Target width (min 1)
height integer yes Target height (min 1)
resize-unit string no px or percent
quality integer no 1–100
dpi integer no Target DPI
convert-to string no Target format (jpg, png, webp, ...)

Example request:

curl -X POST https://newisty.com/api/image/process \
  -F "images[][email protected]" \
  -F "width=800" \
  -F "height=600" \
  -F "quality=85" \
  -F "convert-to=webp"

Example response:

{
  "status": true,
  "message": "Image(s) processed successfully",
  "data": [
    {
      "success": true,
      "message": "Success",
      "filename": "ab12cd34.webp",
      "extension": "webp",
      "width": 800,
      "height": 600,
      "aspect_ratio": 1.3333333,
      "size_bytes": 48621,
      "size_human": "47.48 KB",
      "sha1": "d2a4f8...",
      "unit": "px",
      "base64": "data:image/webp;base64,UklGR..."
    }
  ],
  "meta": null
}

Note: images responds per-file; urls (newline-separated URL list) is also accepted.


POST /api/image/convert

Convert an image to another format (jpg, jpeg, png, webp, gif, bmp). Returns binary file.

Rate: Light task — multipart/form-data

Param Type Required Description
image file yes Source image (max 12 MB)
format string yes Output format
quality integer no 1–100 (default 90)
filename string no Output filename (max 180)

Example request:

curl -X POST https://newisty.com/api/image/convert \
  -F "[email protected]" \
  -F "format=webp" \
  -F "quality=90" \
  -o converted.webp

Example response (binary):

HTTP/1.1 200 OK
Content-Type: image/webp
Content-Disposition: attachment; filename="x7f3ka9b.webp"

<binary image bytes>

POST /api/image/metadata-clean

Strip EXIF/metadata from an image. Returns cleaned binary image.

Rate: Light task — multipart/form-data

Param Type Required Description
image file yes jpg, jpeg, png, webp
output_format string no auto, image/jpeg, image/png, image/webp (default auto)
quality integer no 10–100 (default 92)
prefer_smallest boolean no Prefer smallest output (default false)

Example request:

curl -X POST https://newisty.com/api/image/metadata-clean \
  -F "[email protected]" \
  -F "output_format=image/webp" \
  -o clean.webp

Example response (binary):

HTTP/1.1 200 OK
Content-Type: image/webp
Content-Disposition: attachment; filename="photo-clean.webp"
X-Clean-Extension: webp

<binary image bytes>

POST /api/image/enlarge

Increase image file size (kb/mb) without visible quality loss. Max 20 MB input.

Rate: Light task — multipart/form-data

Param Type Required Description
image file one of Uploaded image
path string one of Image URL
min number no Min target size (default 10)
max number no Max target size (default 50)
unit string no kb or mb (default kb)

Example request:

curl -X POST https://newisty.com/api/image/enlarge \
  -F "[email protected]" \
  -F "min=10" \
  -F "max=50" \
  -F "unit=kb"

Example response:

{
  "status": true,
  "message": "Image enlarged successfully",
  "data": {
    "url": "https://newisty.com/uploads/temp/ab12cd34.jpg",
    "size_bytes": 34800,
    "size_human": "33.98 KB",
    "width": 1024,
    "height": 768,
    "mime": "image/jpeg"
  },
  "meta": null
}

PDF

POST /api/pdf/generate

Generate a PDF from text or images.

Rate: Light task

Mode A — text: JSON / form fields

Param Type Required Description
text string yes Text content
filename string no Output name (max 180)

Example request (text):

curl -X POST https://newisty.com/api/pdf/generate \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello World\nThis is a test PDF.", "filename": "hello"}'

Example response (text, binary):

HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="x7f3ka9b.pdf"

<binary pdf bytes>

Mode B — images: multipart/form-data

Param Type Required Description
images file[] yes jpg, jpeg, png, gif, webp, bmp (max 12 MB each)
image_data string yes JSON array, e.g. [{"file":"photo.jpg","scale":100,"dpi":150,"fit":"contain"}]

Example request (images):

curl -X POST https://newisty.com/api/pdf/generate \
  -F "images[][email protected]" \
  -F "images[][email protected]" \
  -F 'image_data=[{"file":"cover.jpg","scale":100,"dpi":150},{"file":"page2.jpg","scale":100,"dpi":150}]'

Example response (images):

{
  "status": true,
  "message": "Success",
  "data": {
    "location": "uploads/pdf/ab12cd34.pdf",
    "filename": "x7f3ka9b.pdf"
  },
  "meta": null
}

POST /api/pdf/from-html

Convert HTML / HTML file / URL to PDF.

Rate: Light task — JSON / form fields

Param Type Required Description
source_type string yes html, html_file, url
html string cond. HTML string (if html)
html_file file cond. HTML file (if html_file, max 5 MB)
url string cond. URL (if url)
title string no PDF title (max 500)
filename string no Output name (max 180)
response_type string no binary or link (default link for JSON)
render_mode string no readability or full_page
allow_private_hosts boolean no Allow private network hosts
wait_dynamic_content boolean no Wait for JS render
dynamic_wait_ms integer no 0–30000
layout string no portrait, landscape
paper_size string no e.g. a4, letter
margin_top/right/bottom/left number no 0–50 (mm)
scale number no 0.1–2
print_background boolean no
header_footer boolean no

Example request:

curl -X POST https://newisty.com/api/pdf/from-html \
  -H "Content-Type: application/json" \
  -d '{
    "source_type": "html",
    "html": "<h1>Invoice #1024</h1><p>Paid in full.</p>",
    "title": "Invoice",
    "layout": "portrait",
    "paper_size": "a4"
  }'

Example response (default link):

{
  "status": true,
  "message": "Success",
  "data": {
    "location": "https://newisty.com/temp/upload/ab12cd34-1786-7f3ka9b.pdf",
    "filename": "ab12cd34-1786-7f3ka9b.pdf"
  },
  "meta": null
}

With response_type: "binary" you get the PDF bytes directly instead. Note: location can be null (only filename set) in some render modes.


POST /api/pdf/text

Extract text from a PDF.

Rate: Light task — multipart/form-data

Param Type Required Description
pdf_file file yes PDF (mimes:pdf)
page / page_number integer no Single page (min 1)
page_numbers / pages string/list no Comma-separated pages or ranges
page_limit integer no Max pages to process
start_page / end_page integer no Range (min 1)
retain_image_content boolean no Keep image-layer text
ignore_encryption boolean no Try to read encrypted PDFs
decode_memory_limit integer no Memory limit

Example request:

curl -X POST https://newisty.com/api/pdf/text \
  -F "[email protected]" \
  -F "pages=1-3"

Example response:

{
  "success": true,
  "text": "Chapter 1\nIntroduction to APIs\n\nAn API is a set of rules...",
  "pages": [1, 2, 3]
}

Note: this endpoint returns bare JSON without the status/message/data envelope. pages contains the processed page numbers (empty if not applicable).


POST /api/pdf/merge

Merge multiple PDFs (with per-file page selection).

Rate: Light task — multipart/form-data

Param Type Required Description
pdf_files file[] yes PDFs (max 50 MB each), unique filenames
pdf_data string yes JSON array, e.g. [{"file":"a.pdf","pages":"all"},{"file":"b.pdf","pages":"1-3,5"}]
filename string no Output name (max 180)

Example request:

curl -X POST https://newisty.com/api/pdf/merge \
  -F "pdf_files[][email protected]" \
  -F "pdf_files[][email protected]" \
  -F 'pdf_data=[{"file":"report-a.pdf","pages":"all"},{"file":"report-b.pdf","pages":"1,3-5"}]'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "location": "uploads/pdf/ab12cd34.pdf",
    "filename": "x7f3ka9b.pdf"
  },
  "meta": null
}

POST /api/pdf/split

Split a PDF into page groups.

Rate: Light task — multipart/form-data

Mode A — one file:

Param Type Required Description
pdf_file file yes PDF (max 50 MB)
splits string yes Page ranges, e.g. 1-3,4,5-7 (max 1200 chars)
merge_into_one boolean no Merge outputs into one PDF

Mode B — multiple files: pdf_files[] + pdf_data (same shape as merge).

Example request (mode A):

curl -X POST https://newisty.com/api/pdf/split \
  -F "[email protected]" \
  -F "splits=1-2,3,4-6"

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "location": [
      "https://newisty.com/temp/upload/ab12cd34-0.pdf",
      "https://newisty.com/temp/upload/ab12cd34-1.pdf",
      "https://newisty.com/temp/upload/ab12cd34-2.pdf"
    ],
    "filename": ["x7f3ka9b-0.pdf", "x7f3ka9b-1.pdf", "x7f3ka9b-2.pdf"],
    "merge_into_one": false
  },
  "meta": null
}

QR Code

POST /api/qr-code/generate

Generate QR code. The content field is named after qr_type.

Rate: Light task — form fields

Param Type Required Description
qr_type string no url (default), text, wifi, email, phone, sms, vcard, location
url / text / ... string yes Content field matching qr_type
qr_size integer no 50–2000 (default 300)
qr_margin integer no 0–100 (default 10)
qr_color string no Hex #000000
qr_bg_color string no Hex #ffffff
qr_ecc string no L, M, Q, H
qr_format string no png, svg, jpg, gif, webp, bmp, eps, html, xml, json, text
quality integer no 1–100 (default 85)
draw_circular boolean no Rounded modules
invert_matrix boolean no Invert colors
image_transparent boolean no Transparent background
has_label boolean no Show text label
label_text string no Label text (max 200)
label_font_size integer no 6–72
has_logo boolean no Embed logo
logo_predefined string no Predefined logo key
logo_file file no Logo image (max 2 MB)
logo_size integer no 5–100 (default 20)

Example request:

curl -X POST https://newisty.com/api/qr-code/generate \
  -H "Content-Type: application/json" \
  -d '{
    "qr_type": "url",
    "url": "https://example.com",
    "qr_size": 300,
    "qr_format": "png",
    "qr_ecc": "M",
    "has_label": true,
    "label_text": "example.com"
  }'

Example response:

{
  "status": true,
  "message": "QR Code generated successfully",
  "data": {
    "image_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
    "format": "png",
    "size": 300,
    "type": "url",
    "mime_type": "image/png",
    "previewable": true,
    "color": "#000000",
    "bg_color": "#ffffff"
  },
  "meta": null
}

POST /api/qr-code/decode

Decode QR from image.

Rate: Light task — multipart/form-data

Param Type Required Description
image file yes png, jpg, jpeg, gif, webp, bmp (max 5 MB)

Example request:

curl -X POST https://newisty.com/api/qr-code/decode \
  -F "[email protected]"

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "decoded_text": "https://example.com"
  },
  "meta": null
}

Avatar

POST /api/avatar/mesh-gradient

Generate mesh-gradient avatar (SVG + base64).

Rate: Light task — form fields

Param Type Required Description
seed string no Random seed (max 200); random if empty
size integer no 64–1024 (default 512)
shape string no square, circle, squircle
base_color string no Hex color
solid_color string no Hex color
saturation number no 0–4
contrast number no 0–4
fade_distance integer no 40–200
text string no Initials (max 24)
font_family string no Font name
font_size_ratio number no 0.01–1
text_shadow number no 0–4
pixel_enabled boolean no Pixel pattern (default true)
pixel_grid_size integer no 3–31
pixel_opacity number no 0–1
pixel_density number no 0–1
pixel_color_mode string no gradient, monochrome, accent
pixel_shape string no squares, circles, mix

Example request:

curl -X POST https://newisty.com/api/avatar/mesh-gradient \
  -H "Content-Type: application/json" \
  -d '{"seed": "my-avatar-1", "size": 256, "shape": "circle", "text": "JD"}'

Example response:

{
  "status": true,
  "message": "Avatar generated successfully",
  "data": {
    "seed": "my-avatar-1",
    "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"256\" height=\"256\">...</svg>",
    "base64": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0..."
  },
  "meta": null
}

Text & Data

POST /api/data-converter/convert

Convert between JSON / YAML / TOML.

Rate: Light task — form fields

Param Type Required Description
content string yes Input data (max 200 KB)
from string yes auto, json, yaml, yml, toml
to string yes json, yaml, yml, toml

Example request:

curl -X POST https://newisty.com/api/data-converter/convert \
  -H "Content-Type: application/json" \
  -d '{"content": "{\"name\": \"API\", \"version\": 1}", "from": "auto", "to": "yaml"}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "location": "https://newisty.com/temp/upload/ab12cd34-1786-7f3ka9b.pdf",
    "filename": "ab12cd34-1786-7f3ka9b.pdf"
  },
  "meta": null
}

POST /api/text-diff/diff

Unified diff between two texts.

Rate: Light task — form fields

Param Type Required Description
old_text string yes Max 200 KB, ≤1500 combined lines
new_text string yes Max 200 KB

Example request:

curl -X POST https://newisty.com/api/text-diff/diff \
  -H "Content-Type: application/json" \
  -d '{"old_text": "hello world\nfoo", "new_text": "hello there\nfoo\nbar"}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "lines": [
      { "type": "context", "prefix": " ", "old": 1, "new": 1, "text": "hello world" },
      { "type": "removed", "prefix": "-", "old": 1, "new": null, "text": "hello world" },
      { "type": "added", "prefix": "+", "old": null, "new": 2, "text": "hello there" },
      { "type": "context", "prefix": " ", "old": 2, "new": 3, "text": "foo" },
      { "type": "added", "prefix": "+", "old": null, "new": 4, "text": "bar" }
    ],
    "additions": 2,
    "deletions": 1
  },
  "meta": null
}

POST /api/markdown/to-html

Rate: Light task — form fields

Param Type Required Description
markdown string yes Max 200 KB
sanitize boolean no Sanitize HTML (default true)
method string no commonmark, gfm (default gfm)

Example request:

curl -X POST https://newisty.com/api/markdown/to-html \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Hello\n\nThis is **bold**.", "method": "gfm", "sanitize": true}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "html": "<h1>Hello</h1>\n<p>This is <strong>bold</strong>.</p>"
  },
  "meta": null
}

POST /api/markdown/to-text

Strip markdown formatting → plain text. Response data key is text.

Rate: Light task — markdown (string, required, max 200 KB)

Example request:

curl -X POST https://newisty.com/api/markdown/to-text \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Hello\n\nThis is **bold**."}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "text": "Hello\n\nThis is bold."
  },
  "meta": null
}

POST /api/markdown/html-to-markdown

Rate: Light task — html (string, required, max 200 KB)

Example request:

curl -X POST https://newisty.com/api/markdown/html-to-markdown \
  -H "Content-Type: application/json" \
  -d '{"html": "<h1>Hello</h1><p>This is <strong>bold</strong>.</p>"}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "markdown": "# Hello\n\nThis is **bold**."
  },
  "meta": null
}

POST /api/markdown/stats

Rate: Light task — markdown (string, required, max 200 KB)

Example request:

curl -X POST https://newisty.com/api/markdown/stats \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Hello\n\nThis is a [link](https://example.com) and ![img](a.png)."}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "words": 8,
    "characters": 44,
    "characters_without_spaces": 37,
    "lines": 3,
    "paragraphs": 2,
    "headings": 1,
    "links": 1,
    "images": 1,
    "code_blocks": 0,
    "estimated_reading_time": "1 min"
  },
  "meta": null
}

POST /api/developer/code-formatter

Minify or beautify code.

Rate: Light task — form fields

Param Type Required Description
language string yes html, css, js/javascript, sql, xml, json, php, yaml/yml, ini, csv, toml, env/dotenv
code string yes Max 200 KB
mode string no minify (default), pretty, beautify

Example request:

curl -X POST https://newisty.com/api/developer/code-formatter \
  -H "Content-Type: application/json" \
  -d '{"language": "json", "mode": "pretty", "code": "{\"name\":\"API\",\"version\":1}"}'

Example response:

{
  "status": true,
  "message": "Code processed successfully.",
  "data": {
    "mode": "pretty",
    "action": "pretty",
    "language": "json",
    "output": "{\n    \"name\": \"API\",\n    \"version\": 1\n}"
  },
  "meta": null
}

POST /api/string/bad-word-check

Check text for bad words.

Rate: Light task — form fields

Param Type Required Description
string string yes Text (max 20 KB)

Example request:

curl -X POST https://newisty.com/api/string/bad-word-check \
  -H "Content-Type: application/json" \
  -d '{"string": "This is a perfectly clean sentence."}'

Example response:

{
  "status": true,
  "message": "Success",
  "data": {
    "is_bad_word": false,
    "first_bad_word": null,
    "bad_word_count": 0,
    "char_count": 34,
    "word_count": 6,
    "line_count": 1,
    "masked_text": "This is a perfectly clean sentence.",
    "highlighted_html": "This is a perfectly clean sentence.",
    "message": "No bad words found."
  },
  "meta": null
}

Page Generators

Rate: Light task for all.

POST /api/about-us-page-generator/generate

Param Type Required
site_name string yes (max 120)
site_url string yes (max 255)
business_by string yes (max 30)
business_type string yes (max 120)
contact_info string yes (max 255)
template string yes (theme key)
found_year string no (max 10)

Available templates: agency, content, corporate, creative, default, ecommerce, minimal, mission, nonprofit, product, service, startup, team, template2, template3, template4, template5, template6

Example request:

curl -X POST https://newisty.com/api/about-us-page-generator/generate \
  -H "Content-Type: application/json" \
  -d '{
    "site_name": "Acme Inc",
    "site_url": "https://acme.com",
    "business_by": "John Doe",
    "business_type": "Software Company",
    "contact_info": "[email protected]",
    "template": "default",
    "found_year": "2015"
  }'

Example response:

{
  "status": true,
  "message": "Generated",
  "data": {
    "html": "<section class=\"about-us\">\n  <h1>About Acme Inc</h1>\n  ...</section>"
  },
  "meta": null
}

POST /api/contact-us-page-generator/generate

Param Type Required
template string no (default default)
website_name string yes (max 120)
website_email email yes
phone_enabled boolean no
website_phone string cond. (max 40)
address_enabled boolean no
website_address string cond. (max 255)
live_chat_enabled boolean no
social_enabled boolean no
facebook_enabled / facebook_url boolean/string cond.
twitter_enabled / twitter_url boolean/string cond.
instagram_enabled / instagram_url boolean/string cond.
whatsapp_enabled / whatsapp_number boolean/string cond.

Available templates (default default): aurora, canvas, connectly, default, float, harmony, kiosk, lumina, nexora, nudge, orbit, prism, pulse, serene, velox, zephyr

Example request:

curl -X POST https://newisty.com/api/contact-us-page-generator/generate \
  -H "Content-Type: application/json" \
  -d '{
    "website_name": "Acme Inc",
    "website_email": "[email protected]",
    "phone_enabled": true,
    "website_phone": "+8801700000000",
    "address_enabled": true,
    "website_address": "Dhaka, Bangladesh",
    "whatsapp_enabled": true,
    "whatsapp_number": "+8801700000000"
  }'

Example response:

{
  "status": true,
  "message": "Generated",
  "data": {
    "html": "<section class=\"contact-us\">\n  <h2>Contact Acme Inc</h2>\n  ...</section>"
  },
  "meta": null
}

POST /api/privacy-policy-generator/generate

Param Type Required
update_date string yes (max 40)
site_name string yes (max 120)
site_url string yes (max 255)
contact_info string yes (max 255)
toc_page string no (max 255)
has_cookies boolean no
has_ads boolean no
has_adsense boolean no
response_time_number integer no (1–365, default 30)
response_time_format string no (max 20, default day)

Example request:

curl -X POST https://newisty.com/api/privacy-policy-generator/generate \
  -H "Content-Type: application/json" \
  -d '{
    "update_date": "2026-08-11",
    "site_name": "Acme Inc",
    "site_url": "https://acme.com",
    "contact_info": "[email protected]",
    "has_cookies": true,
    "has_adsense": true
  }'

Example response:

{
  "status": true,
  "message": "Generated",
  "data": {
    "html": "<section class=\"privacy-policy\">\n  <h1>Privacy Policy</h1>\n  ...</section>"
  },
  "meta": null
}

POST /api/terms-and-condition-generator/generate

Param Type Required
update_date string yes (max 40)
site_name string yes (max 120)
site_url string yes (max 255)
contact_info string yes (max 255)
privacy_policy_url string no (max 255)

Example request:

curl -X POST https://newisty.com/api/terms-and-condition-generator/generate \
  -H "Content-Type: application/json" \
  -d '{
    "update_date": "2026-08-11",
    "site_name": "Acme Inc",
    "site_url": "https://acme.com",
    "contact_info": "[email protected]"
  }'

Example response:

{
  "status": true,
  "message": "Generated",
  "data": {
    "html": "<section class=\"terms\">\n  <h1>Terms and Conditions</h1>\n  ...</section>"
  },
  "meta": null
}

Video Downloader

Download videos from supported sites (YouTube, etc.) via the download service. Flow: info → start → poll progress/{jobId} → download/{jobId}.

Rate: Heavy task for info/start (external engine), Light task for progress/download (local reads).

POST /api/video-downloader/info

Fetch video metadata (title, thumbnail, available formats) for a URL. Result is cached forever per URL.

Param Type Required Description
url string yes Video URL (public http/https, max 500 chars)

Example request:

curl -X POST https://newisty.com/api/video-downloader/info \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"}'

Example response:

{
  "status": true,
  "message": "Video information fetched.",
  "data": {
    "id": "jNQXAC9IVRw",
    "title": "Me at the zoo",
    "thumbnail": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
    "uploader": "jawed",
    "duration": 19,
    "duration_text": "0:19",
    "formats": []
  },
  "meta": null
}

Note: formats entries are flattened when the server does not expose the full format list; download quality is handled by format in /start. Info is cached forever per URL.


POST /api/video-downloader/start

Queue a download for the given URL + quality. Starts a transient queue worker automatically; returns a job_id to poll. One active download per IP at a time (429 if another is still in progress).

Param Type Required Description
url string yes Video URL (public http/https, max 500 chars)
format string yes best-mp4, 1080p, 720p, 480p, audio-m4a, audio-mp3 (availability depends on server ffmpeg)

Example request:

curl -X POST https://newisty.com/api/video-downloader/start \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw", "format": "best-mp4"}'

Example response:

{
  "status": true,
  "message": "Download started.",
  "data": { "job_id": "34326ec8-c670-4408-a191-37e343a3609d" },
  "meta": { "tier": "best-mp4" }
}

Possible errors: 429 "You already have a download in progress. Please wait for it to finish." or "The downloader is busy. Please try again in a moment." — wait a few seconds and retry start.


GET /api/video-downloader/progress/{jobId}

Poll download state. Poll every 2–5 seconds; the job stays in the queue for a few seconds to a minute before a worker picks it up.

Example request:

curl "https://newisty.com/api/video-downloader/progress/34326ec8-c670-4408-a191-37e343a3609d"

Example response (queued — worker not started yet):

{
  "status": true,
  "message": "Download queued.",
  "data": {
    "status": "queued",
    "message": "Preparing download…"
  },
  "meta": null
}

Example response (downloading):

{
  "status": true,
  "message": "Download status.",
  "data": {
    "status": "downloading",
    "message": "Downloading…",
    "percent": 42.5,
    "speed": "1.2MiB/s",
    "eta": "00:12"
  },
  "meta": null
}

Status values: queued → starting → downloading / processing / merging → done | failed. On done the payload also includes filename + size.

Retry behavior for API clients:

  • 404 → job no longer exists (never dispatched, or already consumed and no state file was kept). The early polls right after start can return 404 if the worker has not picked the job up yet and the job is not visible in the queue — clients should tolerate a few 404s (poll at least 10 times / ~20–30 seconds) before giving up.
  • failed status → the video/URL itself failed (private, removed, region-blocked, or temporary server issue). Retry the whole flow by calling /start again, ideally after a short delay.

GET /api/video-downloader/download/{jobId}

Download the finished file (binary). Only available when progress reported done.

Example request:

curl "https://newisty.com/api/video-downloader/download/34326ec8-c670-4408-a191-37e343a3609d" \
  -o video.mp4

Example response (binary):

HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Disposition: attachment; filename="Me at the zoo [jNQXAC9IVRw].mp4"

<binary video bytes>

Note: the download job_id becomes invalid after the job finishes or the file expires; a 404 means the file is gone.


DELETE /api/video-downloader/cancel/{jobId}

Cancel a queued/in-flight download and delete its partial files. Idempotent: safe to call when the job already finished or expired.

Example request:

curl -X DELETE "https://newisty.com/api/video-downloader/cancel/34326ec8-c670-4408-a191-37e343a3609d"

Example response:

{
  "status": true,
  "message": "Download job canceled.",
  "data": null,
  "meta": null
}

Retry behavior: after 404 on /progress/{jobId} for ~1 minute (job still waiting/unknown), cancel it and start a new download via /start. The cancel endpoint deletes both the queued job (queue + Redis/DB) and the partial storage/app/ytdlp/{jobId} folder.


Lookups (Light task, 10/min)

Rate: Light task.

GET /api/ip

Your current IP.

Example request:

curl https://newisty.com/api/ip

Example response:

{
  "status": true,
  "message": "Current IP resolved",
  "data": {
    "ip": "103.55.22.11"
  },
  "meta": null
}

GET /api/domain/whois?domain=example.com

WHOIS data.

Example request:

curl "https://newisty.com/api/domain/whois?domain=example.com"

Example response:

{
  "status": true,
  "message": "WHOIS lookup completed.",
  "data": {
    "success": true,
    "type": "domain",
    "raw-data": "Connecting to COM.whois-servers.net...\r\nWHOIS Server: whois.markmonitor.com...",
    "whois-data": {},
    "sort-data": {
      "Domain Status": ["clientDeleteProhibited", "clientTransferProhibited"],
      "Name Server": ["NS1.GOOGLE.COM", "NS2.GOOGLE.COM"]
    },
    "sanitized": "example.com",
    "raw": "..."
  },
  "meta": null
}

Note: uses raw WHOIS protocol sockets — can take several seconds; some TLDs or timeouts return an error envelope instead.


GET /api/domain/age?domain=example.com

Domain age.

Example request:

curl "https://newisty.com/api/domain/age?domain=example.com"

Example response:

{
  "status": true,
  "message": "Domain age lookup completed.",
  "data": {
    "success": true,
    "type": "domain",
    "sanitized": "example.com",
    "sort-data": {
      "Domain Age": "30 years, 11 months, 28 days - (11311 days)",
      "Domain Age Years, Months, Days": "30 years, 11 months, 28 days",
      "Last Updated": "1 year, 0 months, 9 days - (368 days)",
      "Domain Will Expire": "1 year, 2 months, 1 days - (422 days)",
      "Name Server": "NS1.GOOGLE.COM, NS2.GOOGLE.COM",
      "Domain Status": "clientDeleteProhibited, clientTransferProhibited"
    }
  },
  "meta": null
}

GET /api/domain/expiry?domain=example.com

Domain expiry date. Note: same payload as /api/domain/age (controller reuses the age computation); expiry data lives in sort-data → Domain Will Expire.

Example request:

curl "https://newisty.com/api/domain/expiry?domain=example.com"

Example response:

{
  "status": true,
  "message": "Domain expiry lookup completed.",
  "data": {
    "success": true,
    "type": "domain",
    "sanitized": "example.com",
    "sort-data": {
      "Domain Will Expire": "1 year, 2 months, 1 days - (422 days)",
      "Domain Will Expire Formatted": "1 year, 2 months, 1 days, 15 hours, 13 minutes and 52 seconds"
    }
  },
  "meta": null
}

GET /api/country/list?search=&by=

Country list. by options: name (default), alpha, capital, region.

Example request:

curl "https://newisty.com/api/country/list?search=ban&by=name"

Example response:

{
  "status": true,
  "message": "Country list loaded",
  "data": {
    "countries": [
      {
        "name": { "common": "Bangladesh", "official": "People's Republic of Bangladesh" },
        "flags": { "svg": "https://.../bgd.svg", "alt": "flag of Bangladesh" },
        "cca3": "BGD",
        "region": "Asia"
      }
    ],
    "count": 1
  },
  "meta": null
}

GET /api/country/{by}/{value}

Single country by field. Valid by values: name, alpha, capital, region (name matches the common name; for alpha codes pass the 3-letter code).

Example request:

curl "https://newisty.com/api/country/alpha/bgd"
curl "https://newisty.com/api/country/name/bangladesh"
curl "https://newisty.com/api/country/capital/dhaka"

Example response:

{
  "status": true,
  "message": "Country found",
  "data": {
    "country": {
      "name": { "common": "Bangladesh", "official": "People's Republic of Bangladesh" },
      "cca3": "BGD",
      "capital": ["Dhaka"],
      "region": "Asia",
      "flag": { "url_svg": "https://.../bgd.svg", "description": "flag of Bangladesh" }
    }
  },
  "meta": null
}

GET /api/fake-credit-card/generate?issuer=&name=

Fake (Luhn-valid) test card. issuer: random (default) or an issuer key. name: cardholder (max 80).

Issuers: visa, mastercard, amex, discover, switch, jcb, unionpay, diners, diners_16, interpayment, instapayment, dankort, solo, laser, maestro, maestro_uk, mir, rupay.

Example request:

curl "https://newisty.com/api/fake-credit-card/generate?issuer=visa&name=John+Doe"

Example response:

{
  "status": true,
  "message": "Generated successfully.",
  "data": {
    "issuer": "visa",
    "issuer_name": "Visa",
    "visual_brand": "visa",
    "number_raw": "4111111111111111",
    "number_formatted": "4111 1111 1111 1111",
    "exp": "08/29",
    "exp_month": "08",
    "exp_year": "2029",
    "cvv": "321",
    "bank_name": "Chase",
    "card_product": "Signature"
  },
  "meta": null
}

GET /api/fake-credit-card/verify?number=&issuer=

Luhn + issuer validation. issuer: auto (default) or specific.

Example request:

curl "https://newisty.com/api/fake-credit-card/verify?number=4111111111111111&issuer=auto"

Example response:

{
  "status": true,
  "message": "Verification complete.",
  "data": {
    "valid": true,
    "luhn_valid": true,
    "issuer": "visa",
    "issuer_name": "Visa",
    "length": 16,
    "issuer_match": true,
    "message": "Card number passes all validation checks."
  },
  "meta": null
}

GET /api/dca-calculator/assets

Available DCA investment assets. Asset ids are short codes (btc, eth, sol, ...) — use them as asset_id in /calculate.

Example request:

curl https://newisty.com/api/dca-calculator/assets

Example response:

{
  "status": true,
  "message": "DCA calculator assets loaded",
  "data": {
    "assets": [
      { "id": "btc", "name": "Bitcoin", "symbol": "BTC", "type": "crypto" },
      { "id": "eth", "name": "Ethereum", "symbol": "ETH", "type": "crypto" }
    ]
  },
  "meta": null
}

Lookups (Heavy task, 5/min)

GET /api/ip/lookup?ip=

Geolocation for an IP (defaults to caller IP).

Example request:

curl "https://newisty.com/api/ip/lookup?ip=8.8.8.8"

Example response:

{
  "status": true,
  "message": "IP lookup completed",
  "data": {
    "continent": "NA - North America",
    "country": "US - United States",
    "region": "Virginia",
    "city": "Ashburn",
    "district": "",
    "zip": "20149",
    "lat": 39.03,
    "lon": -77.5,
    "timezone": "America/New_York",
    "isp": "Google LLC",
    "organization": "Google Public DNS",
    "isMobileData": false,
    "isProxy": false,
    "isHosting": true,
    "isTor": null,
    "isVpn": null,
    "dnsGeo": "India - Google LLC",
    "dnsIp": "172.253.211.219"
  },
  "meta": null
}

GET /api/dns/lookup

DNS + geo info for current connection.

Example request:

curl https://newisty.com/api/dns/lookup

Example response:

{
  "status": true,
  "message": "DNS lookup completed",
  "data": {
    "dns": {
      "geo": "Bangladesh - GreenHost",
      "ip": "103.55.22.11"
    },
    "ipLookup": {
      "continent": "AS - Asia",
      "country": "BD - Bangladesh",
      "region": "Dhaka Division",
      "city": "Dhaka",
      "district": "",
      "zip": "",
      "lat": 23.79,
      "lon": 90.4,
      "timezone": "Asia/Dhaka",
      "isp": "GreenHost",
      "organization": "GreenHost",
      "isMobileData": false,
      "isProxy": false,
      "isHosting": true,
      "isTor": null,
      "isVpn": null,
      "dnsGeo": "Bangladesh - GreenHost",
      "dnsIp": "103.55.22.11"
    }
  },
  "meta": null
}

GET /api/subdomain-finder/search?apex=

Enumerate subdomains of an apex domain (eTLD+1) from certificate transparency logs. Results are cached 24h per domain. On rate-limit the service falls back to proxy rotation (when enabled) and then to crt.sh.

Query parameters:

Param Type Description
apex string (required) Registrable domain, e.g. namecheap.com
dates bool (optional) 1 to include first-seen dates
limit int (optional) Cap on returned subdomains (1–5000)

Example request:

curl "https://newisty.com/api/subdomain-finder/search?apex=namecheap.com&dates=1"

Example response:

{
  "status": true,
  "message": "Subdomains found",
  "data": {
    "success": true,
    "apex": "namecheap.com",
    "source": "crt.name",
    "quota_remaining": 998,
    "count": 2,
    "subdomains": [
      {
        "sub": "api.namecheap.com",
        "first_seen": "2024-04-21T04:56:29Z"
      },
      {
        "sub": "www.namecheap.com",
        "first_seen": "2026-01-05T00:00:00Z"
      }
    ],
    "message": "Subdomains found for namecheap.com"
  },
  "meta": null
}

When every source is rate-limited the endpoint returns HTTP 429 with "success": false and an empty subdomains array.


Currency codes (cached 24h).

Example request:

curl "https://newisty.com/api/currency/list?search=USD"

Example response:

{
  "status": true,
  "message": "Currency list loaded",
  "data": {
    "currencies": [
      { "code": "USD", "name": "US Dollar" }
    ],
    "count": 1
  },
  "meta": null
}

GET /api/currency/convert?amount=&base=&target=&date=

Param Type Required Description
amount number yes Amount
base string yes Base code, e.g. USD
target string yes Target code, e.g. BDT
date string no latest (default) or YYYY-MM-DD

Example request:

curl "https://newisty.com/api/currency/convert?amount=100&base=USD&target=BDT"

Example response:

{
  "status": true,
  "message": "Conversion completed",
  "data": {
    "amount": 100,
    "base": "USD",
    "target": "BDT",
    "rate": 109.42,
    "converted_amount": 10942,
    "requested_date": "latest",
    "resolved_date": "2026-08-10",
    "is_latest": true,
    "used_latest_fallback": false
  },
  "meta": null
}

Rate table for one base currency.

Example request:

curl "https://newisty.com/api/currency/table?base=USD&search=eur"

Example response:

{
  "status": true,
  "message": "Exchange rate table loaded",
  "data": {
    "base": "USD",
    "requested_date": "latest",
    "resolved_date": "2026-08-10",
    "is_latest": true,
    "used_latest_fallback": false,
    "rows": [
      { "code": "EUR", "name": "Euro", "rate": 0.9214, "display_rate": "0.9214" },
      { "code": "GBP", "name": "British Pound", "rate": 0.7841, "display_rate": "0.7841" }
    ]
  },
  "meta": null
}

POST /api/readability/extract

Fetch URL and extract readable article.

Param Type Required
url string yes

Example request:

curl -X POST https://newisty.com/api/readability/extract \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/blog/post"}'

Example response:

{
  "status": true,
  "message": "Readable article extracted successfully.",
  "data": {
    "article": {
      "url": "https://example.com/blog/post",
      "title": "Post Title",
      "author": "Author Name",
      "site_name": "Example",
      "excerpt": "Short summary of the article...",
      "image": "https://example.com/cover.jpg",
      "content_html": "<div><p>Clean readable content...</p></div>"
    },
    "pretty_html": "<!DOCTYPE html><html lang=\"en\"><head>...</head><body>...</body></html>"
  },
  "meta": null
}

Note: article can be null for pages where no article is detected (e.g. single-purpose landing pages).


AI Gateway

Unified, authenticated proxy for chat_completions, responses, messages, gemini and raw custom upstreams. One client base URL, routed by exact model id with priority-ordered fallback. Upstream bodies are relayed verbatim with gateway metadata merged.

Base URL: https://newisty.com/api/ai/v1 — route names api.ai-gateway.* (use route('api.ai-gateway.chat-completions') etc., not hard-coded). Point any OpenAI-compatible SDK's base_url/baseURL straight at it.

Auth: Authorization: Bearer sk-gw-... or x-api-key: sk-gw-... (Anthropic SDKs). GET /models also requires auth and is filtered by key allowed_models.

Rate: global throttle:60,1 on api/ai/v1 + per-key rate_limit_per_minute (if set). Exceeding returns 429 with OpenAI error shape.

Error envelope (always OpenAI-shaped, not status/message/data):

{ "error": { "message": "...", "type": "invalid_request_error", "code": "model_not_found" } }

401 invalid_api_key, 403 model_not_allowed, 404 model_not_found, 400 stream_not_supported|missing_model|unsupported_gemini_method, 502 all_providers_failed, 429 rate_limited.

Endpoints:

Method Path Inbound shape Upstream mapping
GET /api/ai/v1/models — OpenAI list, filtered by allowed_models
POST /api/ai/v1/chat/completions OpenAI Chat translated per provider api_compatible
POST /api/ai/v1/responses OpenAI Responses → chat_completions/messages/gemini
POST /api/ai/v1/messages Anthropic Messages x-api-key + anthropic-version upstream
POST /api/ai/v1/v1beta/models/{model}:generateContent Google Gemini (contents[], systemInstruction, generationConfig) ?key= or x-goog-api-key upstream
POST /api/ai/v1/raw Raw passthrough (body relayed verbatim) custom upstream at its base_url; model from body.model or X-Gateway-Model header; 400 missing_model if absent; stream:true still 400

GET /api/ai/v1/models

List distinct routable model ids (active provider + active model, allowed_models filtered).

Example:

curl https://newisty.com/api/ai/v1/models \
  -H "Authorization: Bearer sk-gw-..."

Response:

{ "object": "list", "data": [{ "id": "gpt-4o", "object": "model", "owned_by": "mySiteName" }] }

POST /api/ai/v1/chat/completions

Params: model (string, required), messages (array), system (string), max_tokens, temperature, top_p, stop, stream (refused).

Example:

curl https://newisty.com/api/ai/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o","messages":[{"role":"user","content":"ping"}]}'

POST /api/ai/v1/messages (Anthropic)

curl https://newisty.com/api/ai/v1/messages \
  -H "x-api-key: sk-gw-..." -H "Content-Type: application/json" \
  -d '{"model":"claude-3-5-sonnet-20241022","max_tokens":1024,"messages":[{"role":"user","content":"ping"}]}'

POST /api/ai/v1/v1beta/models/{model}:generateContent (Gemini)

Path captures {model} whole; SDK glues method onto model. :generateContent dispatches, :streamGenerateContent → 400 stream_not_supported. The repeated v1/v1beta is intentional: the Google SDK appends its own /v1beta/models/... to the gateway base URL.

curl https://newisty.com/api/ai/v1/v1beta/models/gemini-1.5-flash:generateContent \
  -H "Authorization: Bearer sk-gw-..." -H "Content-Type: application/json" \
  -d '{"contents":[{"parts":[{"text":"ping"}]}]}'

POST /api/ai/v1/raw

curl https://newisty.com/api/ai/v1/raw \
  -H "Authorization: Bearer sk-gw-..." -H "X-Gateway-Model: gpt-4o" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o","messages":[{"role":"user","content":"ping"}]}'

Success response: upstream JSON object verbatim + injected provider/gateway (unless inject_metadata=false per key or setting('ai_gateway_inject_metadata') off). Arrays/scalars/non-JSON pass through untouched; existing upstream keys never overwritten. Headers always include X-Gateway-*:

{
  // ...upstream...
  "provider": "Newisty", // setting('name')
  "gateway": {
    "upstream_shape": "chat_completions",
    "inbound_shape": "chat_completions",
    "model_requested": "gpt-4o",
    "model_used": "gpt-4o",
    "attempts": 1,
    "latency_ms": 812
  }
}

Cross-shape fallback returns upstream's shape; gateway.upstream_shape tells which. Constrain allowed_models to same-shape if client cannot handle.


Calculators

POST /api/dca-calculator/calculate

Dollar-cost-average backtest (fetches historical prices).

Rate: Heavy task

Param Type Required Description
asset_id string yes Asset id from /assets
amount number yes 1–1000000
frequency string yes daily, weekly, monthly
start_date string yes Y-m-d, ≥ 2017-01-01, ≤ today
end_date string no Y-m-d, ≥ start, ≤ today
currency string no 3-letter code

Example request:

curl -X POST https://newisty.com/api/dca-calculator/calculate \
  -H "Content-Type: application/json" \
  -d '{
    "asset_id": "btc",
    "amount": 100,
    "frequency": "monthly",
    "start_date": "2023-01-01",
    "currency": "USD"
  }'

Example response:

{
  "status": true,
  "message": "DCA result ready",
  "data": {
    "asset": { "id": "btc", "name": "Bitcoin", "symbol": "BTC", "type": "crypto" },
    "currency": "USD",
    "rate": 1,
    "frequency": "monthly",
    "start_date": "2023-01-01",
    "end_date": "2026-08-01",
    "history": {
      "from": "2017-01-01",
      "to": "2026-08-10",
      "latest_price": 61750.5,
      "stale": false
    },
    "summary": {
      "purchases": 44,
      "total_invested": 4400,
      "total_units": 0.0921,
      "current_value": 5685.12,
      "profit": 1285.12,
      "roi": 29.21,
      "avg_buy_price": 47774.16,
      "latest_price": 61750.5
    },
    "compare": {
      "dca_value": 5685.12,
      "lump_value": 6042.33,
      "lump_profit": 1642.33,
      "difference": 357.21,
      "better": "lump"
    },
    "best_month": { "date": "2023-11-01", "change": 21.4 },
    "worst_month": { "date": "2022-06-01", "change": -18.2 },
    "series": [
      { "date": "2023-01-01", "invested": 100, "value": 105.2 }
    ]
  },
  "meta": null
}

GET /api/crypto-gas-fee-calculator/market-data?currency=USD

Live gas fees + market data.

Rate: Heavy task — currency must be 3 uppercase letters (default USD).

Example request:

curl "https://newisty.com/api/crypto-gas-fee-calculator/market-data?currency=USD"

Example response:

{
  "status": true,
  "message": "Crypto gas market data loaded",
  "data": {
    "currency": "USD",
    "fiat_rate": 1,
    "updated_at": "2026-08-11 10:00:00",
    "live": true,
    "partial": false,
    "stale": false,
    "live_count": 10,
    "total_count": 10,
    "chains": [
      {
        "id": "ethereum",
        "name": "Ethereum",
        "layer": "L1",
        "website": "https://ethereum.org",
        "token": "ETH",
        "token_price_usd": 3250.8,
        "gas": { "standard": 8.5, "fast": 10.2, "instant": 12.1 },
        "live": true,
        "updated_at": "2026-08-11 10:00:00"
      },
      {
        "id": "bsc",
        "name": "BNB Smart Chain",
        "layer": "L1",
        "website": "https://www.bnbchain.org",
        "token": "BNB",
        "token_price_usd": 585.4,
        "gas": { "standard": 3.2, "fast": 4.0, "instant": 5.1 },
        "live": true,
        "updated_at": "2026-08-11 10:00:00"
      }
    ]
  },
  "meta": null
}