IRS filings

File 1099 forms with the IRS

Submits original 1099 filings to the IRS through their IRIS service for the vendors and owners you name, for one tax year. Returns one status entry per recipient.

POST
https://api.portal.magicdoor.com/company-app/irs/submissions

Authorization

Authorizationstringrequired
Bearer token — Send your API token in the Authorization header as Bearer <token>. Requests without a valid token are rejected with 401 Unauthorized.

Body

application/json

taxYearintegerrequired

The tax year being filed for, for example 2025.

vendorIdsinteger[]

Vendors to file for, as JSON numbers. Supply this, ownerIds, or both.

ownerIdsinteger[]

Owners to file for, as JSON numbers. Supply this, vendorIds, or both.

Response

200 · One status entry per recipient, whether the filing was accepted or refused.

statusesobject[]

One entry per vendor or owner in the request.

400 · Neither `vendorIds` nor `ownerIds` held anything.

401 · The access token is missing, expired, or not valid for this company.

Ids here are JSON numbers, not strings

Everywhere else in this API a Snowflake id travels as a decimal string, because a 64-bit integer loses precision in JavaScript. On these three endpoints vendorIds, ownerIds and accountId are plain JSON numbers around nineteen digits long. In JavaScript, parse the response with a JSON reviver or a big-integer-aware parser, or the last digits will be silently rounded and you will act on the wrong vendor.

These enums are PascalCase

accountType, status and filingType are turned into strings by hand rather than by the JSON serializer, so they come back PascalCase: Vendor, Accepted, Correction. Most enums elsewhere in this API are camelCase.

A validation failure is a 200, not a 4xx

When the recipients do not pass validation the call still returns 200. Every failing recipient comes back with status of ValidationFailed and an errorMessage saying why. Check the entries, not just the HTTP status.

This files with a tax authority

An accepted transmission is a real filing with the United States Internal Revenue Service. Putting one right afterwards means a separate correction or void filing; there is no delete.

Check GET /company-app/companies/tax-documents/check first: it tells you whether the company is allowed to file at all, and why not if it is not.

Request
{
  "taxYear": 2025,
  "vendorIds": [1830472847398408008],
  "ownerIds": [1830472847398413013]
}
Response
{
  "statuses": [
    {
      "accountId": 1830472847398408008,
      "accountType": "Vendor",
      "status": "Accepted",
      "irisSubmissionId": "1830472847398427027",
      "filingType": "Original",
      "receiptId": "1-000000-00000-000"
    },
    {
      "accountId": 1830472847398413013,
      "accountType": "Owner",
      "status": "ValidationFailed",
      "errorMessage": "Recipient TIN is missing"
    }
  ]
}