PaidPilot Invoice API
PaidPilot Invoice API: Timesheet to invoice JSON. Time entries (hours x rate, optional per-entry rounding, grouping by description, expenses, tax, terms) become a validated invoice JSON with totals, ready to POST to /v1/invoice.pdf for the PDF.
Not tested: has real-world effectsour last check, 2026-10-18
0 of 0checks answered this week
n/amedian answer time
$0.02listed price per call
n/aprice it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://api.paidpilot.io/v1/invoice-from-timesheet
| Category | Everything else |
|---|---|
| Provider host | api.paidpilot.io |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 2 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
We never call tools that send, buy, move money or file anything, not even without paying.
Example input (from the provider)
{
"body": {
"buyer": {
"name": "Blue River Bakery"
},
"currency": "USD",
"default_rate": 85,
"entries": [
{
"date": "2026-10-05",
"description": "Website fixes",
"hours": 1.6
},
{
"date": "2026-10-06",
"description": "Website fixes",
"hours": 2.25
},
{
"date": "2026-10-08",
"description": "Menu photo shoot",
"hours": 3,
"rate": 95
}
],
"expenses": [
{
"amount": 29,
"description": "Stock photo license"
}
],
"group_by": "description",
"invoice_number": "INV-1002",
"issue_date": "2026-10-11",
"rounding": {
"increment_minutes": 15,
"mode": "up"
},
"seller": {
"email": "billing@acme.example",
"name": "Acme Web Studio LLC"
},
"tax_rate": 7,
"terms": "Net 15"
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"buyer": {
"properties": {
"address": {
"maxLength": 400,
"type": "string"
},
"email": {
"format": "email",
"maxLength": 254,
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"name": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"phone": {
"maxLength": 40,
"type": "string"
},
"tax_id": {
"maxLength": 60,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"currency": {
"default": "USD",
"type": "string"
},
"default_rate": {
"description": "Hourly rate for entries without their own rate",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"discount": {
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"due_date": {
"description": "YYYY-MM-DD; or give terms instead",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"entries": {
"items": {
"additionalProperties": false,
"properties": {
"date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"description": {
"maxLength": 250,
"minLength": 1,
"type": "string"
},
"hours": {
"exclusiveMinimum": 0,
"maximum": 1000,
"type": "number"
},
"rate": {
"maximum": 1000000,
"minimum": 0,
"type": "number"
}
},
"required": [
"description",
"hours"
],
"type": "object"
},
"maxItems": 500,
"minItems": 1,
"type": "array"
},
"expenses": {
"description": "Reimbursable expenses, one line each",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"description": {
"maxLength": 250,
"minLength": 1,
"type": "string"
}
},
"required": [
"description",
"amount"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"group_by": {
"default": "entry",
"description": "entry = one line per entry; description = merge entries with the same description and rate",
"enum": [
"entry",
"description"
],
"type": "string"
},
"invoice_number": {
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"issue_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"notes": {
"maxLength": 2000,
"type": "string"
},
"payment_instructions": {
"maxLength": 1000,
"type": "string"
},
"rounding": {
"additionalProperties": false,
"properties": {
"increment_minutes": {
"anyOf": [
{
"const": 1,
"type": "number"
},
{
"const": 5,
"type": "number"
},
{
"const": 6,
"type": "number"
},
{
"const": 10,
"type": "number"
},
{
"const": 15,
"type": "number"
},
{
"const": 30,
"type": "number"
},
{
"const": 60,
"type": "number"
}
],
"description": "Round each entry to this many minutes"
},
"mode": {
"default": "up",
"enum": [
"up",
"nearest"
],
"type": "string"
}
},
"required": [
"increment_minutes"
]