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:
sk_sandbox_1a2b3c4d5e6f7g8h9i0j
2. Install the SDK
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.
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.004. Understand the response
A successful submission returns a Filing object:
{
"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.
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.
client.filings.validate() in sandbox before switching to live.# 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(...)