Developer documentation

TDS Compliance API

REST API for TDS calculation, reasoning storage, and audit trail management. Built for Income Tax Act 2025, effective 1 April 2026.

Base URL https://api.reginfra.com

Overview

The RegInfra API is organized around REST. It accepts JSON request bodies, returns JSON responses, and uses standard HTTP status codes. The API processes one vendor payment per request and returns a complete TDS decision with the full reasoning chain attached.

Every response includes the applicable section, rate, deduction amount, threshold state at payment time, and a plain-English justification suitable for statutory audit documentation. Decisions are stored permanently and queryable at any time.

Income Tax Act 2025 All responses include new Section 393-series references effective 1 April 2026. The API was built for the new Act from day one — not retrofitted.

Test vs live mode

The API key you use determines the mode. Test mode keys have the prefix tds_test_ and do not create compliance records or affect your live vendor data. Live keys have the prefix tds_live_.

Authentication

All requests must include your API key in the x-api-key header. Requests without a valid key return 401 authentication_error.

Request header
x-api-key: tds_live_your_key_here
Content-Type: application/json
Keep your API key secure. Never expose your key in client-side JavaScript, GitHub repositories, or any publicly accessible code. Each key is tied to your account — all usage is logged with timestamps and IP addresses. Compromised keys can be revoked instantly.

Requesting access

During beta, API keys are provisioned manually. Request a free trial at reginfra.com/#trial or email contact@reginfra.com. You will receive a test key within 24 hours on business days.

Base URL & versioning

The current API version is v1. The version is specified in the URL path.

https://api.reginfra.com/v1/tds/{section}/compute

Breaking changes are never made to an existing version. When CBDT issues a circular — rates and thresholds update automatically on the effective date. Your integration keeps working without any changes.

Deprecation notices are issued a minimum of 6 months in advance.

Idempotency

The API supports idempotency for safely retrying requests without processing the same vendor payment twice. Include a unique Idempotency-Key header with every request.

Header
Idempotency-Key: INV-2026-001-v1

Key format

Use your invoice number, transaction reference, or a UUID. Keys must be under 255 characters and are retained for 24 hours.

// Good — use meaningful identifiers
Idempotency-Key: INV-2026-001
Idempotency-Key: TXN-Q1-2026-042
Idempotency-Key: VENDOR_001_2026-04-18_50000

// Bad — too generic, risk of collision
Idempotency-Key: 12345
Same key + different payload = 409 conflict If you retry with the same Idempotency-Key but different request parameters, you receive a 409 idempotency_conflict error. Always use a new key for a new unique transaction.

Core endpoint — compute TDS

This is the primary endpoint. Call it at the moment of vendor payment. It returns the correct TDS decision with the complete reasoning chain and stores the decision permanently.

POST /v1/tds/{section}/compute

Replace {section} with the section identifier — e.g. 194C, 194J, 194A.

Sample request — 194J professional services

Request
POST https://api.reginfra.com/v1/tds/194J/compute
Content-Type: application/json
x-api-key: tds_live_your_key_here
Idempotency-Key: INV-2026-001

{
  "transaction_id": "INV-2026-001",
  "pan": "ABCDE1234F",
  "vendor_name": "ABC Consulting Pvt Ltd",
  "deductee_type": "Company",
  "residential_status": "Resident",
  "pan_status": "Available",
  "is_206ab_applicable": false,
  "is_pan_operative": true,
  "nature_of_payment": "professional_fees",
  "service_type": "Professional_Services",
  "credit_amount": 75000,
  "aggregate_amount_ytd": null,
  "credit_datetime": "2026-04-18T10:00:00"
}
Response — 200 OK
{
  "section": "194J",
  "tds_rate": "0.10",
  "tds_amount": "7500.00",
  "currency": "INR",
  "computed_at": "2026-04-18T10:32:39+00:00",
  "legal_reference": {
    "act": "Income-tax Act, 2025",
    "section": "393 Table 1 S.No.(6)(iii)",
    "section_title": "Fees for professional or technical services",
    "effective_from": "2026-04-01"
  },
  "calculation_reasoning": {
    "threshold_check": "₹75,000 exceeds threshold ₹50,000 — TDS applicable",
    "rate_selection": "10% — PAN available, Professional_Services",
    "aggregate_impact": "YTD after this payment: ₹75,000"
  },
  "meta": {
    "rule_id": "r_ac29066e",
    "rule_version": "1.0.0"
  },
  "warnings": []
}

Request fields

Required fields

FieldTypeDescription
transaction_idstringYour unique transaction reference. Used for idempotency and audit queries.
panstring10-character PAN of the vendor/deductee.
deductee_typestringEntity classification. See accepted values.
residential_statusstringResident or Non-Resident. Non-resident blocks with Section 195 guidance.
pan_statusstringAvailable or Not_Available. Determines higher deduction rate.
is_pan_operativebooleanWhether PAN is operative on payment date. Inoperative PAN triggers higher rate.
nature_of_paymentstringPayment classification. Must match the section called. See accepted values.
credit_amountnumberPayment amount in INR. Used for threshold checking and TDS calculation.
credit_datetimestringISO 8601 datetime of the payment. Used to determine FY and threshold position.

Optional fields

FieldTypeDescription
vendor_namestringStored in the audit record for human-readable querying.
aggregate_amount_ytdnumber / nullCaller-supplied YTD. If null, RegInfra computes from stored records. If supplied and differs from computed, DB value wins and a warning is returned.
is_206ab_applicablebooleanOverride for 206AB applicability. Defaults to false.
service_typestringRequired for 194J to distinguish professional vs technical fees rate.

Response fields

FieldDescription
sectionTDS section applied (e.g. 194J).
tds_rateRate as decimal (e.g. 0.10 for 10%).
tds_amountTDS amount in INR to 2 decimal places.
legal_reference.actFull name of the applicable Act.
legal_reference.sectionExact 393-series section reference from ITA 2025.
calculation_reasoningPlain-English explanation of every decision made. Threshold check, rate selection, PAN status. Suitable for audit documentation.
meta.rule_idUnique identifier of the rule set used. Stored with the transaction.
meta.rule_versionSemantic version of the rule file. Cryptographic fingerprint of which Finance Act rates were active.
warningsArray of non-blocking advisory messages. E.g. YTD mismatch between caller-supplied and computed values.

GET /transactions

Query stored TDS decisions. Returns all decisions matching the filter criteria. Query stored decisions for any vendor, date range, or section. Use for audit documentation, reconciliation, or historical reporting.

GET /v1/tds/transactions

Query parameters

ParameterTypeDescription
vendor_panstringFilter by vendor PAN. Returns all decisions for this vendor.
sectionstringFilter by TDS section (e.g. 194C).
from_datestringISO date. Start of date range.
to_datestringISO date. End of date range.
transaction_idstringRetrieve a single specific decision.
Example
GET /v1/tds/transactions?vendor_pan=ABCDE1234F&from_date=2026-04-01&to_date=2026-06-30

GET /health

Returns API status. Use for monitoring and uptime checks.

GET /v1/health
{ "status": "ok", "version": "1.0.0" }

TDS sections covered

SectionDescriptionThreshold
194AInterest other than on securities₹40,000 / ₹50,000 (banks)
194BWinnings from lottery / crossword puzzle₹10,000
194BAWinnings from online gamingNet winnings per FY
194BBWinnings from horse race₹10,000
194CPayments to contractors₹30,000 single / ₹1,00,000 aggregate
194DInsurance commission₹15,000
194DAPayment on life insurance policy₹1,00,000
194GCommission on lottery tickets₹15,000
194HCommission or brokerage₹15,000
194IRent — land/building/furniture₹2,40,000
194JProfessional / technical fees₹50,000
194MPayment by individual/HUF for contract/professional₹50,00,000
194NCash withdrawal₹1,00,00,000
194OE-commerce operator payments₹5,00,000
194QPurchase of goods₹50,00,000
194RBenefit or perquisite to business/profession₹20,000
194STransfer of virtual digital assets₹50,000 / ₹10,000
194TPayment to partners₹20,000

Section mismatch detection

If you call POST /v1/tds/194C/compute but the nature_of_payment field indicates professional fees, RegInfra returns a 400 section_mismatch error before any deduction is calculated. The error includes the correct section to use.

Error response — 400
{
  "error": "section_mismatch",
  "message": "nature_of_payment 'professional_fees' is not valid under 194C",
  "correct_section": "194J",
  "correct_endpoint": "/v1/tds/194J/compute"
}

Error codes

HTTPError codeMeaning
400section_mismatchPayment type does not match the section called. Response includes correct section.
400invalid_panPAN format invalid or failed validation.
400missing_fieldA required field is absent from the request.
400non_resident_blockedNon-resident vendor — use Section 195 with Form 15CA/15CB. RegInfra does not process non-resident payments.
401authentication_errorAPI key missing, invalid, or revoked.
409idempotency_conflictSame Idempotency-Key used with different request payload.
422validation_errorField values are present but fail validation rules.
429rate_limit_exceededToo many requests. See rate limits.
500internal_errorServer error. Payment is never blocked — fallback mode returns a safe response.

Rate limits

PlanMonthly callsRate limit
Free trial500100 req/min
Starter5,000100 req/min
Growth25,000100 req/min
Scale1,00,000100 req/min
EnterpriseCustomCustom

Rate limit headers are returned with every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

Upcoming endpoints

In development These endpoints are in development and will be available in upcoming releases. Contact contact@reginfra.com if you'd like early access.
  • POST /v1/tds/validate — Pre-payment validation without storing a decision. Check section and rate before committing.
  • GET /v1/tds/ytd/{pan} — Current YTD aggregate for a vendor PAN across all sections.
  • GET /v1/tds/export/26Q — Export quarterly 26Q filing data in NSDL format.