Skip to main content
If your company filed its taxes somewhere else, for example with a previous provider, you can record the filed return in Finta with its PDF. This is the same as clicking I’ve already filed on a tax year’s Taxes page in the Finta app, and it gives the same result: the year’s record is marked filed, the PDF is attached to it, and it shows on the Taxes page exactly as an upload made there would. There are two uploads: Each takes a PDF you upload first, so recording a return takes two steps: upload the PDF to get a 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 a file_ 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:
The content is checked as it arrives. A file that is not a PDF is refused with 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 run curl in a terminal, use POST /file_uploads. Send the file’s name, its size in bytes, and its MD5 checksum in base64:
The response has a url to PUT the PDF’s bytes to, straight to Finta’s file storage, and the headers to send with the PUT:
PUT the file with every header in headers, exactly as given, before expires_at (10 minutes):
Storage accepts only bytes that match the 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_id returns 404 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_at on a file from POST /files). It then returns 404 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 response is the year’s income tax record:
What the upload does:
  • 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_type and 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 its filed_return document with its original file name. filed_at is when you uploaded it, not the date the return was actually filed.
  • The record’s jurisdictions are US plus 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:
The year’s Delaware record (the one that year’s Taxes page shows, created if missing) is marked filed if it is not already, with 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 same file_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.

Handle errors

See Errors for every code.