REST API Free Tier Length-Controlled Summaries

prompt to Text API

Summarise text with a single API call. Built for developers who need consistent outputs, configurable generation settings, and optional response variants at scale.

Why Use This API

AI Text Summarisation

Advanced AI summarisation models tuned for long-form and short-form content. Produces concise, readable summaries while preserving key meaning.

Summary Quality Controls

Control summary length and output style to match product requirements such as short bullets, executive briefs, or plain-language recaps.

Key Points Output

Optionally includes extracted key points so downstream systems can display highlights alongside the summary.

Multi-Paragraph Summaries

Summarise long multi-paragraph inputs in one request. Useful for articles, reports, meeting notes, and customer feedback.

Quick Start

Start summarising text in under a minute. Here's how:

  1. Get your API keySign up free to receive your key
  2. Send a request — POST a text prompt to the endpoint
  3. Get the result — Receive concise summaries as JSON responses
curl -X POST https://precisioncounter.com/api/v1/text-summariser \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "prompt=@sample.png"
import requests

response = requests.post(
    "https://precisioncounter.com/api/v1/text-summariser",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    files={"prompt": open("sample.png", "rb")}
)

data = response.json()
for text in data["text"]:
    print(f"{text['name']} ({text['confidence']:.0%})")
const fs = require("fs");
const FormData = require("form-data");

const form = new FormData();
form.append("prompt", fs.createReadStream("sample.png"));

const response = await fetch(
  "https://precisioncounter.com/api/v1/text-summariser",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_API_KEY",
      ...form.getHeaders()
    },
    body: form
  }
);

const data = await response.json();
data.text.forEach(f => console.log(`${f.name} (${f.confidence})`));

API Reference

Base URL

https://precisioncounter.com/api/v1

Authentication

All requests require an API key passed in the Authorization header:

Authorization: Bearer YOUR_API_KEY

Summarise Text

POST /api/v1/text-summariser

Generates text from an input prompt and returns structured generation results as JSON.

Request Parameters

Parameter Type Description
prompt required file Input text to summarise. Can be plain text, article content, notes, or any long-form paragraph block.
max_summary_length optional integer Maximum summary length in sentences or units. Default: 5. Range: 1-20.
include_key_points optional boolean Include alternate generated variants in the response. Default: true.

Response

200 OK — Returns summarised text data as JSON.

{
  "text": [
    {
      "name": "person",
      "confidence": 0.94,
      "category": "person",
      "box": {
        "x": 124,
        "y": 52,
        "width": 300,
        "height": 540
      }
    }
  ],
  "prompt_width": 1280,
  "prompt_height": 720,
  "processing_time_ms": 450
}

Response Headers

Header Value
Content-Type application/json
X-Credits-Remaining Number of API credits remaining
X-Processing-Time Processing time in milliseconds

Code Examples

Full Examples (with error handling)

curl -X POST https://precisioncounter.com/api/v1/text-summariser \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "prompt=@sample.png" \
  -F "max_summary_length=5" \
  -F "include_key_points=true"
import requests
import sys

API_KEY = "YOUR_API_KEY"
API_URL = "https://precisioncounter.com/api/v1/text-summariser"

def detect_text(input_path, max_summary_length=5):
    """Summarise Text from an prompt file."""
    with open(input_path, "rb") as img:
        response = requests.post(
            API_URL,
            headers={"Authorization": f"Bearer {API_KEY}"},
            files={"prompt": img},
            data={"max_summary_length": max_summary_length, "include_key_points": "true"}
        )

    if response.status_code == 200:
        data = response.json()
        for text in data["text"]:
            print(f"{text['name']} - {text['confidence']:.0%} confidence")
            print(f"  Category: {text['category']}")
            if text.get("box"):
              print(f"  Box: {text['box']}")
        print(f"Credits remaining: {response.headers.get('X-Credits-Remaining')}")
    else:
        print(f"Error {response.status_code}: {response.json()['error']}")

detect_text("sample.png")
const fs = require("fs");
const FormData = require("form-data");
const fetch = require("node-fetch");

const API_KEY = "YOUR_API_KEY";
const API_URL = "https://precisioncounter.com/api/v1/text-summariser";

async function detecttext(inputPath, maxResults = 5) {
  const form = new FormData();
  form.append("prompt", fs.createReadStream(inputPath));
  form.append("max_summary_length", String(maxResults));
  form.append("include_key_points", "true");

  const response = await fetch(API_URL, {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`,
      ...form.getHeaders()
    },
    body: form
  });

  if (response.ok) {
    const data = await response.json();
    data.text.forEach(text => {
      console.log(`${text.name} - ${(text.confidence * 100).toFixed(0)}%`);
      console.log(`  Category: ${text.category}`);
      if (text.box) console.log(`  Box: ${JSON.stringify(text.box)}`);
    });
    console.log(`Credits: ${response.headers.get("x-credits-remaining")}`);
  } else {
    const error = await response.json();
    console.error(`Error ${response.status}: ${error.error}`);
  }
}

detecttext("sample.png");
<?php
$api_key = "YOUR_API_KEY";
$url = "https://precisioncounter.com/api/v1/text-summariser";

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer $api_key"
    ],
    CURLOPT_POSTFIELDS => [
        "prompt" => new CURLFile("sample.png"),
        "max_summary_length" => "5",
        "include_key_points" => "true"
    ]
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $data = json_decode($response, true);
    foreach ($data["text"] as $text) {
        echo $text["name"] . " - " . ($text["confidence"] * 100) . "% confidence\n";
        echo "  Category: " . $text["category"] . "\n";
        if (isset($text["box"])) {
          echo "  Box: " . json_encode($text["box"]) . "\n";
        }
    }
} else {
    echo "Error $httpCode: $response\n";
}
?>
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
)

type textResult struct {
    Name       string   `json:"name"`
    Confidence float64  `json:"confidence"`
    Category   string   `json:"category"`
  Box        map[string]int `json:"box"`
}

type Response struct {
  text        []textResult `json:"text"`
  promptWidth     int            `json:"prompt_width"`
  promptHeight    int            `json:"prompt_height"`
  ProcessingTime int            `json:"processing_time_ms"`
}

func detecttext(inputPath string) error {
    file, _ := os.Open(inputPath)
    defer file.Close()

    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, _ := writer.CreateFormFile("prompt", inputPath)
    io.Copy(part, file)
    writer.WriteField("max_summary_length", "5")
    writer.Close()

    req, _ := http.NewRequest("POST",
        "https://precisioncounter.com/api/v1/text-summariser", body)
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    req.Header.Set("Content-Type", writer.FormDataContentType())

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    if resp.StatusCode == 200 {
        var result Response
        json.NewDecoder(resp.Body).Decode(&result)
        for _, text := range result.text {
            fmt.Printf("%s - %.0f%% confidence\n", text.Name, text.Confidence*100)
        }
    }
    return nil
}

func main() {
    detecttext("sample.png")
}
require "net/http"
require "uri"
require "json"

api_key = "YOUR_API_KEY"
uri = URI("https://precisioncounter.com/api/v1/text-summariser")

form_data = [
  ["prompt", File.open("sample.png", "rb")],
  ["max_summary_length", "5"],
  ["include_key_points", "true"]
]

req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{api_key}"
req.set_form(form_data, "multipart/form-data")

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(req)
end

if res.code == "200"
  data = JSON.parse(res.body)
  data["text"].each do |text|
    puts "#{text['name']} - #{(text['confidence'] * 100).round}% confidence"
    puts "  Category: #{text['category']}"
    puts "  Box: #{text['box']}" if text['box']
  end
else
  puts "Error #{res.code}: #{res.body}"
end
using System.Text.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");

using var form = new MultipartFormDataContent();
var promptContent = new ByteArrayContent(File.ReadAllBytes("sample.png"));
promptContent.Headers.ContentType = new("prompt/png");
form.Add(promptContent, "prompt", "sample.png");
form.Add(new StringContent("5"), "max_summary_length");
form.Add(new StringContent("true"), "include_key_points");

var response = await client.PostAsync(
    "https://precisioncounter.com/api/v1/text-summariser", form);

if (response.IsSuccessStatusCode)
{
    var json = await response.Content.ReadAsStringAsync();
    var data = JsonSerializer.Deserialize<JsonElement>(json);
    foreach (var text in data.GetProperty("text").EnumerateArray())
    {
        Console.WriteLine($"{text.GetProperty("name")} - {text.GetProperty("confidence")}");
    }
}

Error Handling

The API returns standard HTTP status codes with JSON error bodies:

Status Meaning Description
200 Success Text summarised successfully. Response body contains JSON with summary data.
400 Bad Request Missing prompt file, unsupported format, or file too large.
401 Unauthorized Missing or invalid API key.
429 Rate Limited Too many requests. Wait and retry with exponential backoff.
500 Server Error Internal processing error. Retry the request.

Error Response Format

{
  "error": "Invalid file format. Accepted: png, jpg, jpeg, webp",
  "code": "INVALID_FORMAT",
  "status": 400
}

Rate Limits

Plan Requests / Minute Max File Size Max Resolution
Free 10 10 MB 4096 x 4096 px
Pro 60 25 MB 8192 x 8192 px

Rate limit headers are included in every response:

X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1708646400

Use Cases

  • Design asset management
  • Brand consistency checking
  • Web scraping prompt to Text
  • Accessibility compliance
  • Print production
  • prompt analysis research
  • Design tool plugins
  • summary workflow verification

Pricing

Free to Start

Get free API credits when you sign up. No credit card required.

Frequently Asked Questions

What prompt formats does the Text Summariser API support?
The API accepts plain text prompts and returns generated text in a structured JSON response.
Is the Text Summariser API free?
Yes. You get free API calls to try the service when you sign up. No credit card is required to get started.
How accurate is the summary quality?
The API uses modern language models optimized for summarisation. Output quality depends on source clarity and input structure, and performs best on coherent, well-formed text.
Can the API summarise long text in one request?
Yes. Yes. The API can summarise long multi-paragraph content in one request. Use the max_summary_length parameter to control summary size.
Does the API return key points?
Yes. By default, the API can include key points with the summary. You can disable this with the include_key_points parameter set to false.
What information does the API return?
The API returns the generated summary, optional key points, token usage metadata, and processing time.
Does the API store my prompts?
No. prompts are processed in memory and immediately discarded after the response is sent. We do not store, log, or share any uploaded prompts.