Create & File a 1099 Form

In this guide, we will review how to create a Form 1099 document and how to use a webhook to monitor the document's status. This walkthrough assumes that you already have your API Keys. If you already have a User and Payer, you can skip to the document creation section.

1. Create a User

To create a new User call the POST /users API endpoint.

❗️

When creating a User for 1099 Forms, all fields except for phoneNumber and address2 are required.

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/v2/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: "v2",
});

(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/v2/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.squareup.okhttp.*;
// import com.google.gson.JsonObject;

OkHttpClient client = new OkHttpClient();

JsonObject requestBody = new JsonObject();
JsonObject user = new JsonObject();
JsonObject profile = new JsonObject();

user.addProperty("email", "[email protected]");

profile.addProperty("firstName", "Ada");
profile.addProperty("lastName", "Lovelace");
profile.addProperty("addPropertyress", "256 Byron Street");
profile.addProperty("addPropertyress2", "Suite 32");
profile.addProperty("city", "Palo Alto");
profile.addProperty("state", "CA");
profile.addProperty("zipcode", "94306");
profile.addProperty("country", "US");
profile.addProperty("phoneNumber", "6505551010");
profile.addProperty("dateOfBirth", "1815-12-10");
profile.addProperty("socialSecurityNumber", "101456789");

user.add("profile", profile);

requestBody.add("user", user);

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")
  .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"

    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/v2/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/v2/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.

❗️

payerStateId

If your Payer is in one of the following states: Alabama, Kansas, Mississippi, North Dakota, Oregon, or Pennsylvania, you must include a payerStateId. The example below uses payerStateId. Please consult with appropriate tax counsel.

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

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/v2/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/v2/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/v2/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.squareup.okhttp.*;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;

OkHttpClient client = new OkHttpClient();

JsonObject requestBody = new JsonObject();
JsonArray payers = new JsonArray();
JsonObject payerOne = new JsonObject();

payerOne.addProperty("name", "Acme Corp");
payerOne.addProperty("address", "1401 N Shoreline Blvd");
payerOne.addProperty("address2", "Suite 1");
payerOne.addProperty("city", "Mountain View");
payerOne.addProperty("state", "CA");
payerOne.addProperty("country", "US");
payerOne.addProperty("zipcode", "94043");
payerOne.addProperty("phoneNumber", "6501014096");
payerOne.addProperty("taxIdNumber", "123451989");

payers.add(payerOne);

requestBody.add("payers", payers);

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/payers")
  .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/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/v2/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/v2/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

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. Respond to Status Changes Via Webhook

In conjunction with Abound's webhooks, you can receive updated statuses on your documents.

Abound's 1099 Documents follow a consistent status flow:

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

{
  "resource": "documents",
  "resourceId": "documentId_7a42426c297d089499577aeb37a5bbe93e3216f3",
  "resourceURL": "https://sandbox-api.withabound.com/v2/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"
}

Did this page help you?