Create & File a 1099 Form

1: Create a User

To create a new User call the POST /users API endpoint. You can also follow the Getting Started guide to create a User.

📘

When creating a User for 1099 Forms, all fields except for phoneNumber and address2 (when not needed) are required.

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/<<apiVersion>>/users \
  --header 'Authorization: Bearer <<apiKey>>' \
  --header 'Content-Type: application/json' \
  --data '{
    "user": {
      "email": "[email protected]",
      "profile": {
        "firstName": "Ada",
        "lastName": "Lovelace",
        "address": "256 Byron Street",
        "address2": "Suite 32",
        "city": "Palo Alto",
        "state": "CA",
        "zipcode": "94306",
        "country": "US",
        "phoneNumber": "6505551010",
        "dateOfBirth": "1815-12-10",
        "socialSecurityNumber": "101456789"
      }
    }
  }'
const { default: Abound, Environment } = require("@withabound/node-sdk");

const abound = new Abound({
  appId: "<<sandbox_app_id>>",
  appSecret: "<<sandbox_app_secret>>",
  environment: Environment.SANDBOX,
  apiVersion: "<<apiVersion>>",
});

(async () => {
  const response = await abound.users.create({
    email: "[email protected]",
    profile: {
      firstName: "Ada",
      lastName: "Lovelace",
      address: "256 Byron Street",
      address2: "Suite 32",
      city: "Palo Alto",
      state: "CA",
      zipcode: "94306",
      country: "US",
      phoneNumber: "6505551010",
      dateOfBirth: "1815-12-10",
      socialSecurityNumber: "101456789",
    },
  });

  console.log(response);
})();
import requests

url = "https://sandbox-api.withabound.com/<<apiVersion>>/users"

payload = {"user": {
        "profile": {
            "firstName": "Ada",
            "lastName": "Lovelace",
            "address": "256 Byron Street",
            "address2": "Suite 32",
            "city": "Palo Alto",
            "state": "CA",
            "zipcode": "94306",
            "country": "US",
            "phoneNumber": "6505551010",
            "dateOfBirth": "1815-12-10",
            "socialSecurityNumber": "101456789"
        },
        "email": "[email protected]"
    }}
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.withabound.AboundConfig;
//import com.withabound.models.*;
//import  com.withabound.resources.base*;

AboundConfig aboundConfig = new AboundConfig(
  "<<sandbox_app_id>>",
  "<<sandbox_app_secret>>",
  AboundEnvironment.SANDBOX,
  AboundApiVersion.<<apiVersionUppercase>>
);

AboundResponse<User> response = abound.users().create(UserRequest.builder()
  .email("[email protected]")
  .profile(UserProfile.builder()
    .firstName("Ada")
    .lastName("Lovelace")
    .address("256 Byron Street")
    .address2("Suite 32")
    .city("Palo Alto")
    .state("CA")
    .zipcode("94306")
    .phoneNumber("6505551010")
    .dateOfBirth("1815-12-10")
    .socialSecurityNumber("101456789")
    .build())
  .build());

System.out.println(response.getData().getUserId());
package main

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

func main() {

    url := "https://sandbox-api.withabound.com/<<apiVersion>>/users"

    var requestBody = []byte(`{
        "user": {
            "email": "[email protected]",
            "profile": {
                "firstName": "Ada",
                "lastName": "Lovelace",
                "address": "256 Byron Street",
                "address2": "Suite 32",
                "city": "Palo Alto",
                "state": "CA",
                "zipcode": "94306",
                "country": "US",
                "phoneNumber": "6505551010",
                "dateOfBirth": "1815-12-10",
                "socialSecurityNumber": "101456789"
            }
        }
    }`)

    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/<<apiVersion>>/users");
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 {
  user = new {
    email = "[email protected]",
    profile = new {
      firstName =  "Ada",
      lastName = "Lovelace",
      address = "256 Byron Street",
      address2 = "Suite 32",
      city = "Palo Alto",
      state = "CA",
      zipcode = "94306",
      country = "US",
      phoneNumber = "6505551010",
      dateOfBirth = "1815-12-10",
      socialSecurityNumber = "101456789"
    }
  }
});
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'
require 'json'

url = URI("https://sandbox-api.withabound.com/<<apiVersion>>/users")
requestBody = {
  user: {
    email: '[email protected]',
    profile: {
      firstName: 'Ada',
      lastName: 'Lovelace',
      address: '256 Byron Street',
      address2: 'Suite 32',
      city: 'Palo Alto',
      state: 'CA',
      zipcode: '94306',
      country: 'US',
      phoneNumber: '6505551010',
      dateOfBirth: '1815-12-10',
      socialSecurityNumber: '101456789'
    }
  }
}

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

2: Create a Payer

To create a new Payer, call the POST /payers API endpoint.

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/<<apiVersion>>/payers \
  --header 'Authorization: Bearer <<apiKey>>' \
  --header 'Content-Type: application/json' \
  --data '{
    "payers": [
      {
        "name": "Hooli",
        "address": "1401 N Shoreline Blvd",
        "address2": "Suite 1",
        "city": "Mountain View",
        "state": "CA",
        "country": "US",
        "zipcode": "94043",
        "phoneNumber": "6501014096",
        "taxIdNumber": "123451989"
      }
    ]
  }'
const fetch = require('node-fetch');

const url = 'https://sandbox-api.withabound.com/<<apiVersion>>/payers';
const options = {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    Authorization: 'Bearer <<apiKey>>'
  },
  body: JSON.stringify({
    payers: [
      {
        name: "Acme Corp",
        address: "1401 N Shoreline Blvd",
        address2: "Suite 1",
        city: "Mountain View",
        state: "CA",
        country: "US",
        zipcode: "94043",
        phoneNumber: "6501014096",
        taxIdNumber: "123451989"
      }
    ]
  })
};

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/<<apiVersion>>/payers"

payload = {"payers": [
        {
            "name": "Acme Corp",
            "address": "1401 N Shoreline Blvd",
            "address2": "Suite 1",
            "city": "Mountain View",
            "state": "CA",
            "country": "US",
            "zipcode": "94043",
            "phoneNumber": "6501014096",
            "taxIdNumber": "123451989"
        }
    ]}
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.withabound.AboundConfig;
//import com.withabound.models.*;
//import  com.withabound.resources.base*;

AboundConfig aboundConfig = new AboundConfig(
  "<<sandbox_app_id>>",
  "<<sandbox_app_secret>>",
  AboundEnvironment.SANDBOX,
  AboundApiVersion.<<apiVersionUppercase>>
);

PayerRequest toCreate =
  PayerRequest.builder()
  .name("Hooli")
  .address("1401 N Shoreline Blvd")
  .address2("Suite 1")
  .city("Mountain View")
  .state("CA")
  .zipcode("94043")
  .country("US")
  .phoneNumber("6501014096")
  .taxIdNumber("123451989")
  .build();

AboundBulkResponse<Payer> response =
        abound.payers().create(Collections.singletonList(toCreate));

System.out.println(response.getData());
package main

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

func main() {

    url := "https://sandbox-api.withabound.com/<<apiVersion>>/payers"

    var requestBody = []byte(`{
        "payers": [
            {
                "name": "Acme Corp",
                "address": "1401 N Shoreline Blvd",
                "address2": "Suite 1",
                "city": "Mountain View",
                "state": "CA",
                "country": "US",
                "zipcode": "94043",
                "phoneNumber": "6501014096",
                "taxIdNumber": "123451989"
            }
        ]
    }`)

    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/<<apiVersion>>/payers");
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 {
  payers = new[] {
    new {
      name = "Acme Corp",
      address = "1401 N Shoreline Blvd",
      address2 = "Suite 1",
      city = "Mountain View",
      state = "CA",
      country = "US",
      zipcode = "94043",
      phoneNumber = "6501014096",
      taxIdNumber = "123451989"
    }
  }
});
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'
require 'json'

url = URI("https://sandbox-api.withabound.com/<<apiVersion>>/payers")
requestBody = {
  payers: [
    {
      name: 'Acme Corp',
      address: '1401 N Shoreline Blvd',
      address2: 'Suite 1',
      city: 'Mountain View',
      state: 'CA',
      country: 'US',
      zipcode: '94043',
      phoneNumber: '6501014096',
      taxIdNumber: '123451989'
    }
  ]
}

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

️ Payer State ID

Each 1099 requires the filingState to be included on the request. If your Payer is in one of the following states: Alabama, Delaware, Kansas, Mississippi, North Dakota, Oregon, or Pennsylvania, you have to include a payerStateId when creating the 1099 Form. The example below uses payerStateId. Please consult with appropriate tax counsel.

For more information, review the Prerequisites for Issuing 1099 Forms.

3: Create the 1099 Form

Abound® currently supports the following 1099 forms. For an in-depth breakdown of each form and the required fields see below:

4: Monitor Document Status

In conjunction with our webhooks, you can receive updated statuses on your documents. The following provides a timeline that a 1099 Form will go through if it processed successfully and without errors:

  1. Create a 1099 Form, status = "created" (before the Abound® submission deadline)
  2. Social Security Number is submitted to the IRS for validation, status="verifying". This step only occurs the first time you create a 1099 for a user.
  3. 1099 Form is submitted to the IRS and State, status = "pending"
  4. 1099 Form is successfully received by the IRS and State, status = "done"

When a document webhook is updated, the payload will resemble:

📘

documentURLs/resourceURLs expire after 7 days, you can receive a new url using GET Documents

{
  "resource": "documents",
  "resourceId": "documentId_7a42426c297d089499577aeb37a5bbe93e3216f3",
  "resourceURL": "https://sandbox-api.withabound.com/<<apiVersion>>/users/userId_0aa8b15c0cce59aa766156e6328798c80512131a/documents/documentId_7a42426c297d089499577aeb37a5bbe93e3216f3",
  "resourceStatus": "done",
  "event": "documents.updated",
  "userId": "userId_0aa8b15c0cce59aa766156e6328798c80512131a",
  "webhookId": "webhookId_f651462d773efbce6253f553f54767ff26811791",
  "webhookURL": "https://webhook.site/e665ac70-4914-4d8b-ab48-fa2b47680b4a",
  "webhookRequestId": "webhookRequestId_1639156677392"
}

For both a successful and failed 1099 form filing, it’s important that you be notified upon an update to the status of your document. Abound® uses webhooks to communicate with your servers when a relevant event occurs.