1099-NEC Background

If a PayerPayer - An entity that makes payments for: services performed by independent contractors (1099-NEC), interest on a business debt (1099-INT), and payment card transactions settled on behalf of merchants (1099-K). does not consider an individual (UserUser - A single end-user of your application. Each user has a unique userId, which should be stored in your database and used to make API requests on behalf of this individual.) to be an employee and did not withhold income tax or social security and Medicare tax, it must issue a Form 1099-NEC. A PayerPayer - An entity that makes payments for: services performed by independent contractors (1099-NEC), interest on a business debt (1099-INT), and payment card transactions settled on behalf of merchants (1099-K). must file a Form 1099-NEC for each user to whom it paid at least $600 during the tax year in:

  • Services performed by someone who is not an employee (including parts and materials)
  • Cash payments for fish (or other aquatic life) you purchase from anyone engaged in the trade or business of catching fish
  • Payments to an attorney

You must also file Form 1099-NEC for each UserUser - A single end-user of your application. Each user has a unique userId, which should be stored in your database and used to make API requests on behalf of this individual. from whom you have withheld any federal income tax under the backup withholding rules regardless of the amount of the payment.

Issuing a 1099-NEC Form

To issue a 1099-NEC form and initiate the filing process use an existing userId and payerId and call the POST /users/{userId}/documents API endpoint.

Below is the request:

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents \
  --header 'Authorization: Bearer <<apiKey>>' \
  --header 'Content-Type: application/json' \
  --data '{
    "documents": [
      {
        "type": "1099nec",
        "year": 2021,
        "payerId": "<<testPayerId>>",
        "accountNumber": "1234567890",
        "nonemployeeCompensation": 234.23,
        "hasDirectSalesOver5000": false,
        "federalIncomeTaxWithheld": 233.23,
        "stateTaxInfo": [
          {
            "stateTaxWithheld": 323.23,
            "filingState": "CA",
            "payersStateNumber": "1234567891",
            "stateIncome": 3455.43
          },
          {
            "stateTaxWithheld": 323.23,
            "filingState": "AZ",
            "payersStateNumber": "1234567892",
            "stateIncome": 3455.43
          }
        ]
      }
    ]
  }'
const fetch = require('node-fetch');

const url = 'https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents';
const options = {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    Authorization: 'Bearer <<apiKey>>'
  },
  body: JSON.stringify({
    documents: [
      {
        type: '1099nec',
        year: 2021,
        payerId: '<<testPayerId>>',
        accountNumber: '1234567890',
        nonemployeeCompensation: 234.23,
        hasDirectSalesOver5000: false,
        federalIncomeTaxWithheld: 233.23,
        stateTaxInfo: [
          {
            stateTaxWithheld: 323.23,
            filingState: 'CA',
            payersStateNumber: '1234567891',
            stateIncome: 3455.43
          },
          {
            stateTaxWithheld: 323.23,
            filingState: 'AZ',
            payersStateNumber: '1234567892',
            stateIncome: 3455.43
          }
        ]
      }
    ]
  })
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error('error:' + err));
import requests

url = "https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents"

payload = {"documents": [
        {
            "type": "1099nec",
            "year": "2021",
            "payerId": "<<testPayerId>>",
            "accountNumber": "1234567890",
            "nonemployeeCompensation": 234.23,
            "hasDirectSalesOver5000": False,
            "federalIncomeTaxWithheld": 233.23,
            "stateTaxInfo": [
                {
                    "stateTaxWithheld": 323.23,
                    "filingState": "CA",
                    "payersStateNumber": "1234567891",
                    "stateIncome": 3455.43
                },
                {
                    "stateTaxWithheld": 323.23,
                    "filingState": "AZ",
                    "payersStateNumber": "1234567892",
                    "stateIncome": 3455.43
                }
            ]
        }
    ]}
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer <<apiKey>>"
}

response = requests.request("POST", url, json=payload, headers=headers)

print(response.text)
// import com.squareup.okhttp.*;
// import com.google.gson.JsonObject;
// import com.google.gson.JsonArray;

OkHttpClient client = new OkHttpClient();

JsonObject requestBody = new JsonObject();
JsonArray documents = new JsonArray();
JsonObject ten99NEC = new JsonObject();
JsonArray ten99NECStateTaxInfos = new JsonArray();
JsonObject ten99NECStateTaxInfoOne = new JsonObject();
JsonObject ten99NECStateTaxInfoTwo = new JsonObject();

ten99NEC.addProperty("type", "1099nec");
ten99NEC.addProperty("year", 2021);
ten99NEC.addProperty("payerId", "<<testPayerId>>");
ten99NEC.addProperty("accountNumber", "1234567890");
ten99NEC.addProperty("nonemployeeCompensation", 234.23);
ten99NEC.addProperty("hasDirectSalesOver5000", false);
ten99NEC.addProperty("federalIncomeTaxWithheld", 233.23);

ten99NECStateTaxInfoOne.addProperty("stateTaxWithheld", 323.23);
ten99NECStateTaxInfoOne.addProperty("filingState", "CA");
ten99NECStateTaxInfoOne.addProperty("payersStateNumber", "1234567891");
ten99NECStateTaxInfoOne.addProperty("stateIncome", 3455.43);

ten99NECStateTaxInfoTwo.addProperty("stateTaxWithheld", 323.23);
ten99NECStateTaxInfoTwo.addProperty("filingState", "AZ");
ten99NECStateTaxInfoTwo.addProperty("payersStateNumber", "1234567892");
ten99NECStateTaxInfoTwo.addProperty("stateIncome", 3455.43);

ten99NECStateTaxInfos.add(ten99NECStateTaxInfoOne);
ten99NECStateTaxInfos.add(ten99NECStateTaxInfoTwo);

ten99NEC.add("stateTaxInfo", ten99NECStateTaxInfos);

documents.add(ten99NEC);

requestBody.add("documents", documents);

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, requestBody.toString());
Request request = new Request.Builder()
  .url("https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents")
  .post(body)
  .addHeader("Accept", "application/json")
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer <<apiKey>>")
  .build();

Response response = client.newCall(request).execute();
package main

import (
    "bytes"
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {

    url := "https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents"

    var requestBody = []byte(`{
        "documents": [
            {
                "type": "1099nec",
                "year": 2021,
                "payerId": "<<testPayerId>>",
                "accountNumber": "1234567890",
                "nonemployeeCompensation": 234.23,
                "hasDirectSalesOver5000": false,
                "federalIncomeTaxWithheld": 233.23,
                "stateTaxInfo": [
                    {
                        "stateTaxWithheld": 323.23,
                        "filingState": "CA",
                        "payersStateNumber": "1234567891",
                        "stateIncome": 3455.43
                    },
                    {
                        "stateTaxWithheld": 323.23,
                        "filingState": "AZ",
                        "payersStateNumber": "1234567892",
                        "stateIncome": 3455.43
                    }
                ]
            }
        ]
    }`)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(requestBody))

    req.Header.Add("Accept", "application/json")
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Authorization", "Bearer <<apiKey>>")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    fmt.Println(res)
    fmt.Println(string(body))

}
// using RestSharp;

var client = new RestClient("https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents");
var request = new RestRequest(Method.POST);
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer <<apiKey>>");
request.AddJsonBody(new {
  documents = new[] {
    new {
      type = "1099nec",
      year = 2021,
      payerId = "<<testPayerId>>",
      accountNumber = "1234567890",
      nonemployeeCompensation = 234.23,
      hasDirectSalesOver5000 = false,
      federalIncomeTaxWithheld = 233.23,
      stateTaxInfo = new[] {
        new {
          stateTaxWithheld = 323.23,
          filingState = "CA",
          payersStateNumber = "1234567891",
          stateIncome = 3455.43
        },
        new {
          stateTaxWithheld = 323.23,
          filingState = "AZ",
          payersStateNumber = "1234567892",
          stateIncome = 3455.43
        }
      }
    }
  }
});
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'
require 'json'

url = URI("https://sandbox-api.withabound.com/v2/users/<<testUserId>>/documents")
requestBody = {
  documents: [
    {
      type: '1099nec',
      year: 2021,
      payerId: '<<testPayerId>>',
      accountNumber: '1234567890',
      nonemployeeCompensation: 234.23,
      hasDirectSalesOver5000: false,
      federalIncomeTaxWithheld: 233.23,
      stateTaxInfo: [
        {
          stateTaxWithheld: 323.23,
          filingState: 'CA',
          payersStateNumber: '1234567891',
          stateIncome: 3455.43
        },
        {
          stateTaxWithheld: 323.23,
          filingState: 'AZ',
          payersStateNumber: '1234567892',
          stateIncome: 3455.43
        }
      ]
    }
  ]
}

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Accept"] = 'application/json'
request["Content-Type"] = 'application/json'
request["Authorization"] = 'Bearer <<apiKey>>'
request.body = requestBody.to_json

response = http.request(request)
puts response.read_body

The response:

{
  "data": [
    {
      "documentId": "documentId_testefbd5d3d9ee9526ef9ff89a7c6b879174170",
      "documentURL": "https://tax-documents-sandbox.s3.us-west-2.amazonaws.com/test62ae93bafa6310aa9952e8b3bf5796443111/2021_Form_1099-NEC.pdf?AWSAccessKeyId=AKIA6C6AUYYBZMXK74XQ&Expires=1630423763&Signature=TZnExYSnxm2dzM%2Bof7EfCOiSG34%3D",
      "documentName": "2021 Form 1099-NEC",
      "type": "1099nec",
      "year": "2021",
      "status": "pending",
      "createdTimestamp": 1628275165630
    }
  ]
}

Form 1099-NEC Fields

Below is the Form 1099-NEC with fields overlaid:

Form 1099-NEC Definitions

Below are Abound's fields and descriptions as they relate to the Form 1099-NEC.

Field

Form 1099-NEC

Description

documentId

--

The unique id generated by Abound API to designate this document. Store this value in your database.

status

--

The status generated by Abound API. Possible statuses include: "created", "pending", "cancelled", "error" and "done".

type

--

This specifies the Form 1099 type, in this case, enter 1099nec.

payerId

--

Unique ID associated with the Payer. Store this value in your database.

year

--

This is the tax year associated with the Form 1099-NEC.

accountNumber

Account number

If the Payer assigns the contractor a unique number for its records, enter the account number in this box. If not, leave the box blank.

nonemployeeCompensation

Box 1 -- Nonemployee compensation

($) Total amount remitted by Payer to Recipient during a year

hasDirectSalesOver5000

Box 2: Direct sales (checkbox)

If checked, consumer products totaling $5,000 or more were sold to Recipient for resale, on a buy-sell, a deposit-commission, or other basis.

federalIncomeTaxWithheld

Box 4. Federal income tax withheld

($) Shows backup withholding. A Payer must backup withhold on certain payments if Recipient did not provide a TIN to the Payer.

stateTaxWithheld

Box 5. State tax withheld

($) Up to two (2) states per Form 1099-NEC.

filingState

Box 6. State/ Payer's tax no.

Up to two (2) states per Form 1099-NEC.

payersStateNumber

Box 6. State/ Payer's tax no.

Up to two (2) states per Form 1099-NEC.

stateIncome

Box 7. State income

($) Up to two (2) states per Form 1099-NEC.


Did this page help you?