Reportkey Public API

The Reportkey Public API gives eligible customers a supported way to work with account, project, report, and job data through a stable REST contract.

Base URL

  • https://api.reportkey.net

Current v1 surface

  • GET /api/v1/ returns the API bootstrap payload.
  • GET /api/v1/me returns the authenticated account and token summary.
  • GET /api/v1/projects and GET /api/v1/projects/{project_id} return project inventory and safe project detail.
  • POST /api/v1/projects, PATCH /api/v1/projects/{project_id}, POST /api/v1/projects/{project_id}/archive, and POST /api/v1/projects/{project_id}/restore provide the safe project shell write surface.
  • GET /api/v1/projects/{project_id}/reports and GET /api/v1/reports/{report_id} return report history summaries.
  • GET /api/v1/projects/{project_id}/jobs and GET /api/v1/jobs/{job_id} return read-only generation job summaries.
  • POST /api/v1/projects/{project_id}/generation-jobs starts one-time report generation.
  • GET /api/v1/generation-jobs/{generation_job_id} polls durable generation status.
  • POST /api/v1/reports/{report_id}/export-jobs starts PDF or DOC export.
  • GET /api/v1/export-jobs/{export_job_id} and GET /api/v1/export-jobs/{export_job_id}/download poll and deliver the completed export artifact.

Access and limits

  • Authenticated responses expose X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.
  • 429 responses use Retry-After and the machine-readable codes rate_limit_exceeded or quota_exceeded.
  • 403 api_access_required means the current plan or add-on state does not allow Public API usage.
  • All authenticated API operations share the same account-wide limit bucket.
  • Current authenticated API limits are 120 requests/minute and 4,000 requests/day per account.
  • Every authenticated operation spends from the same bucket, including reads, writes, async starts, polling, and completed export downloads.
  • Daily quotas reset on the UTC day boundary.
  • 503 api_controls_unavailable means the API cannot process the request right now and the client should retry later.

Async flow

  1. Start generation for a project with POST /api/v1/projects/{project_id}/generation-jobs.
  2. Poll GET /api/v1/generation-jobs/{generation_job_id} until completed.
  3. Start export for the resulting report with POST /api/v1/reports/{report_id}/export-jobs.
  4. Poll GET /api/v1/export-jobs/{export_job_id} and then call /download to fetch the artifact.

Quick start with curl

curl -sS https://api.reportkey.net/api/v1/me \
  -H 'Authorization: Bearer rkpat_yourpublicid.yoursecret'

Quick start with JavaScript

const response = await fetch('https://api.reportkey.net/api/v1/projects?page=1&per_page=20', {
  headers: {
    Authorization: 'Bearer rkpat_yourpublicid.yoursecret',
  },
});

const payload = await response.json();
console.log(payload.data.items);

Quick start with Python

import requests

response = requests.get(
    "https://api.reportkey.net/api/v1/projects/123/reports",
    headers={"Authorization": "Bearer rkpat_yourpublicid.yoursecret"},
    timeout=20,
)
response.raise_for_status()
print(response.json()["data"]["items"])

Response contract

  • Successful responses use the envelope {"ok": true, "data": ..., "meta": ...}.
  • List endpoints include meta.pagination with page, per_page, total, and total_pages.
  • Timestamps are UTC ISO-8601 strings such as 2026-04-09T20:30:00Z.
  • Error responses use {"ok": false, "error": {"code": "...", "message": "..."}, "meta": ...}.

Where to go next