POST /taxes/income_uploadsrecords the filed income tax return.POST /taxes/franchise_uploadsrecords the filed Delaware franchise tax and annual report.
file_id, then call the tax upload with it. Uploading is one call with POST /files, or two with a direct upload: POST /file_uploads, then a PUT of the PDF to storage. All four endpoints on this page require API access: Manage and Taxes: Manage for the key owner.
For a company with no records for a year, upload the income tax return first, then the Delaware report. The income upload sets up the year’s records, including the Delaware one the report attaches to.
Step 1: upload the PDF
There are two ways to upload a PDF. Both return a file with afile_ ID that you pass to a tax upload.
With a multipart request
POST /files takes the PDF as multipart/form-data in a field named file:
400 invalid_file, whatever its name or declared type.
With a direct upload URL
Where a multipart request isn’t practical, such as an AI agent that can runcurl in a terminal, use POST /file_uploads. Send the file’s name, its size in bytes, and its MD5 checksum in base64:
url to PUT the PDF’s bytes to, straight to Finta’s file storage, and the headers to send with the PUT:
headers, exactly as given, before expires_at (10 minutes):
size and checksum you sent, so the URL can’t be used to store a different file. Each call returns a new URL and a new file. Treat the URL as a secret until it expires.
The PDF check for a direct upload happens when a tax upload attaches the file: a file whose bytes were never PUT, or that is not a PDF, is refused then with 400 invalid_file.
Rules for files
- A file belongs to the company of the key that uploaded it. Another company’s
file_idreturns404 resource_missing. - A file attaches to one tax record, once. Attaching it again returns
409 file_already_attached; upload the PDF again to attach it to another record. - A file nothing attaches within 24 hours of its creation expires (
expires_aton a file fromPOST /files). It then returns404 resource_missing, and Finta deletes it. An attached file stays with its tax record.
Step 2: record the return
Income tax return
POST /taxes/income_uploads takes four required fields:
- The PDF is checked first. A Delaware franchise tax report (a PDF whose text contains “Annual Franchise Tax Report”) is refused with
400 wrong_document_typeand nothing is recorded; send it to the franchise upload instead. - The year’s income record is created, or overwritten if one exists. It is marked filed, with
filed_elsewhere: true, and the PDF becomes itsfiled_returndocument with its original file name.filed_atis when you uploaded it, not the date the return was actually filed. - The record’s
jurisdictionsareUSplus the states you sent. - The year’s Delaware franchise record is set up too. It is marked filed only if Finta’s Delaware status check already shows the report filed; attach the report with the franchise upload.
Delaware franchise tax report
POST /taxes/franchise_uploads takes two required fields:
filed_elsewhere: true. The PDF becomes its filing_confirmation document, replacing any earlier one, and is renamed [<tax_year>] <company name> Delaware Confirmation.pdf, as the Taxes page names it. The response is the year’s franchise tax record.
Retry safely
A tax upload that fails changes nothing and leaves the file unattached, so you can retry with the samefile_id while it is valid. A tax upload that succeeded cannot be repeated with the same file; it returns 409 file_already_attached. Uploading a new file for the same year replaces that year’s PDF, as uploading again on the Taxes page does.