Quickstart

File your first CT600 return in under 5 minutes.

This guide walks you through filing a sandbox CT600 return from scratch. No HMRC credentials, no credit card, no XML.

1. Get a sandbox API key

Create a Render account — it takes about 30 seconds. You will receive a sandbox API key that looks like:

text
sk_sandbox_1a2b3c4d5e6f7g8h9i0j
Sandbox keys never touch HMRC. All validation and response behaviour is identical to live mode. Switch environments by swapping your key — nothing else changes.

2. Install the SDK

PythonNode.js
pip install render

Or, if you prefer to call the API directly with cURL or your own HTTP client, skip to the API reference.

3. Create your first filing

All monetary values are integers in pence. £120,000 is 12000000. This eliminates floating point errors.

PythonNode.js
import render

client = tunnel.Render(api_key="sk_sandbox_1a2b3c4d5e6f")

filing = client.filings.create(
    company={
        "name": "Your Company Ltd",
        "utr": "1234567890",            # 10-digit UTR
        "registration_number": "12345678"
    },
    period={
        "start": "2024-04-01",
        "end":   "2025-03-31"
    },
    financials={
        "turnover":        90_000_00,   # £90,000 in pence
        "gross_profit":    45_000_00,   # £45,000
        "net_profit":      12_000_00,   # £12,000
        "trading_profit":  12_000_00,   # Box 37
        "tax_rate_year":   2025
    },
    accounts={
        "standard": "frs102"            # "frs102" | "frs105"
    }
)

print(filing.id)      # "fil_1a2b3c4d5e6f"
print(filing.status)  # "submitted"
print(filing.tax_due_pence)  # 2280000  → £22,800.00

4. Understand the response

A successful submission returns a Filing object:

Response
{
  "id":               "fil_1a2b3c4d5e6f",
  "object":           "filing",
  "status":           "submitted",
  "correlation_id":   "hmrc_abc123",
  "company_utr":      "1234567890",
  "period_start":     "2024-04-01",
  "period_end":       "2025-03-31",
  "tax_due_pence":    2280000,
  "submitted_at":     "2025-03-04T14:23:00Z",
  "acknowledged_at":  null,
  "livemode":         false
}

The status starts as submitted. HMRC acknowledges asynchronously — usually within a few seconds in sandbox, longer in live. When HMRC acknowledges, Render delivers a filing.acknowledged webhook and sets acknowledged_at.

Handle errors

Every error response has the same shape. The field tells you exactly which input was wrong; the doc_url links to the fix.

Python — error handling
from render.errors import ValidationError, AuthenticationError

try:
    filing = client.filings.create(...)
except ValidationError as e:
    print(e.code)     # "invalid_utr"
    print(e.field)    # "company.utr"
    print(e.message)  # "UTR must be exactly 10 digits."
except AuthenticationError:
    print("Check your API key.")

5. Go live

When you are ready to file for real, swap your sandbox key for a live key. The live key begins with sk_live_. Nothing else in your code changes.

Live keys route submissions to HMRC. Always validate a return with client.filings.validate() in sandbox before switching to live.
python
# Validate first (no submission to HMRC)
result = client.filings.validate(
    company={...},
    period={...},
    financials={...},
)

if result["valid"]:
    # Swap key and submit
    live_client = tunnel.Render(api_key="sk_live_...")
    filing = live_client.filings.create(...)

Next steps