assets/skills/jsonbill/SKILL.md
Generate a PDF invoice/statement files from JSON via JSONBill API.
npx skillsauth add quailyquaily/mistermorph jsonbillInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
API base: https://api.jsonbill.com
This skill is designed to call the JSONBill REST API without ever exposing API keys/tokens to the LLM:
The host must be configured (outside this skill) with:
jsonbillJSONBILL_API_KEYAuthorization: Bearer <secret>)POST /tasks/docsGET /tasks/{trace_id}GET /tasks/{trace_id}.pdf (usually you can return this URL without downloading)Notes:
Inputs:
invoice_source: either (a) JSON object, or (b) local file path to a JSON file
Definitions (abstract operations; map to your agent/tooling):
READ_TEXT(path) -> string
PARSE_JSON(text) -> object
HTTP_JSON(method, url, auth_profile, json_body, headers?) -> {status, json, text}
HTTP_BYTES(method, url, auth_profile, headers?) -> {status, bytes, content_type}
SLEEP(seconds)
SAVE_BYTES(path, bytes) -> saved_path
SEND_FILE(saved_path, filename, caption?) (optional; if your platform supports files)
Procedure:
if invoice_source is a local path:
invoice_text = READ_TEXT(invoice_source)
invoice_json = PARSE_JSON(invoice_text)
else:
invoice_json = invoice_source
# 1) Create async generation task
create = HTTP_JSON(
method="POST",
url="https://api.jsonbill.com/tasks/docs",
auth_profile="jsonbill",
json_body=invoice_json
)
assert create.status is 2xx
trace_id = create.json.trace_id (or create.json.data.trace_id depending on API)
assert trace_id is not empty
# 2) Poll until done (backoff recommended)
interval = 1.0
deadline_seconds = 60
elapsed = 0
while true:
poll = HTTP_JSON(
method="GET",
url="https://api.jsonbill.com/tasks/" + trace_id,
auth_profile="jsonbill",
json_body=null
)
assert poll.status is 2xx
status = poll.json.status
if status == 3:
break
if status == 4:
raise error with poll.json (or poll.text)
SLEEP(interval)
elapsed += interval
if elapsed >= deadline_seconds:
raise timeout
interval = min(interval * 1.5, 8.0)
# 3) PDF download
pdf_url = "https://api.jsonbill.com/tasks/" + trace_id + ".pdf"
if platform supports sending files:
pdf = HTTP_BYTES(
method="GET",
url=pdf_url,
auth_profile="jsonbill",
headers={"Accept": "application/pdf"}
)
assert pdf.status is 2xx
assert pdf.bytes is non-empty
saved = SAVE_BYTES("jsonbill/invoice_" + trace_id + ".pdf", pdf.bytes)
SEND_FILE(saved, filename="invoice.pdf", caption="Your PDF invoice")
else:
return pdf_url
| Status | Meaning | Action |
|---:|---|---|
| 3 | Completed | Return PDF URL. |
| 4 | Error/failed | Abort and surface error details. |
| other | Pending/in-progress | Keep polling until timeout. |
testing
The social network for AI agents. Post, comment, upvote, and create communities.
development
Parse Google Maps URLs to extract coordinates(lat/lng) and POI
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.