Pricing & Limits
Understand how Knowhere bills jobs and enforces usage limits.
Usage Pricing
Knowhere currently charges $0.0015 per billable page, or $1.50 per 1,000 pages.
Knowhere stores balance internally in micro-dollars, where 1 credit = $1.00.
Example Costs
- 1 page → $0.0015
- 100 pages → $0.15
- 500 pages → $0.75
- 10,000 pages → $15.00
How Billable Pages Are Counted
| File Type | Billing Rule |
|---|---|
PDF (.pdf) | Physical page count |
PowerPoint (.pptx) | Slide count |
Word / Text / Markdown (.docx, .txt, .md) | ceil((Chinese chars + English words + numbers) / 500) |
Excel (.xlsx) | ceil(total rows across all sheets / 50) |
Images (.jpg, .jpeg, .png) | 1 page per image |
When Charges Happen
Credits are deducted after the worker downloads the source file and estimates billable pages, but before parsing starts.
If a charged job later fails during processing, Knowhere automatically refunds the charged amount. If billing fails, parsing does not start.
Rate Limits
Knowhere uses separate limits for general API traffic and job creation.
The Python and Node.js SDKs are the recommended integration path. They handle polling, retries, uploads, and download orchestration for you.
System Limits For Authenticated Endpoints
| Endpoint Pattern | Limit |
|---|---|
GET /v1/jobs/* | 200 requests/minute per user |
| All other authenticated endpoints | 1000 requests/minute per user |
Job Creation Limits (POST /v1/jobs)
| Tier | Lifetime Successful Payments | Job Creations / Minute | Concurrent Active Jobs | Job Creations / Day |
|---|---|---|---|---|
| Free | < $10 | 2 | 2 | 20 |
| Tier 1 | >= $10 | 15 | 5 | Unlimited |
| Tier 2 | >= $50 | 20 | 10 | Unlimited |
| Tier 3 | >= $100 | 50 | 20 | Unlimited |
| Tier 4 | >= $500 | 100 | 50 | Unlimited |
| Tier 5 | >= $2,000 | Unlimited | Unlimited | Unlimited |
An "active" job is any job still in a non-terminal state, such as waiting-file, pending, running, or converting.
Rate Limit Headers
When a request is rejected with 429 Too Many Requests, the response includes rate limit headers:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1742457600
X-RateLimit-Period: minute
| Header | Description |
|---|---|
Retry-After | Seconds to wait before retrying |
X-RateLimit-Limit | Limit for the triggered rule |
X-RateLimit-Remaining | Remaining requests in the current window |
X-RateLimit-Reset | Unix timestamp when the current window resets |
X-RateLimit-Period | Window type, such as minute, day, or concurrent |
Successful responses do not currently include these headers.
For job-creation rejections, the period in the error details can be minute, day, or concurrent depending on which rule was exceeded.
Handling Rate Limits
When you exceed a limit, you'll receive a 429 Too Many Requests response:
{
"success": false,
"error": {
"code": "RESOURCE_EXHAUSTED",
"message": "Rate limit exceeded. Please retry after 30 seconds.",
"request_id": "req_abc123",
"details": {
"reason": "RATE_LIMIT_EXCEEDED",
"retry_after": 30,
"limit": 2,
"period": "minute"
}
}
}
Best practice: respect Retry-After, and use backoff when polling job status.
- Python
- Node.js
import time
import requests
response = requests.get(url, headers=headers)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 30))
time.sleep(retry_after)
response = requests.get(url, headers=headers) # Retry
let response = await fetch(url, { headers });
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '30', 10);
await new Promise(r => setTimeout(r, retryAfter * 1000));
response = await fetch(url, { headers }); // Retry
}
File And Format Limits
| Setting | Current Value |
|---|---|
| Max source file size | 100 MB |
| Supported upload types | .docx, .pdf, .txt, .xlsx, .pptx, .jpg, .jpeg, .png, .md |
Contact team@knowhereto.ai for enterprise pricing with custom limits.
Usage Monitoring
View your usage in the Knowhere Dashboard:
- Current credits balance
- Usage history and trends
- Billing history
- Invoice downloads
Billing FAQ
When am I charged?
The worker charges the job before parsing starts, immediately after it estimates the page count.
What happens if a job fails after billing?
If Knowhere already charged the job and processing later fails, the charged amount is refunded automatically.
Do credits expire?
Credits are currently valid for 365 days.
Can I get a refund?
Automatic job-level refunds are handled by the API when a charged job later fails. For payment or account-related refund requests, contact team@knowhereto.ai.
How do I buy more credits?
- Sign in to the Knowhere Dashboard
- Go to Usage (Usage & Billing)
- Click your Credits badge in the top-right
- In the purchase dialog, choose an available credits package or enter a custom amount
- Complete checkout in Stripe
Credits currently expire after 365 days.
What payment methods are accepted?
We accept all major credit cards through Stripe:
- Visa
- Mastercard
- American Express
- And more
Enterprise
Need custom limits, SLAs, or dedicated support?
Contact team@knowhereto.ai to discuss enterprise requirements.