Tax Payment Walkthrough

Submitting quarterly tax payments on behalf of independent workers is easy to implement with Abound’s API. There are three steps to create your first Quarterly Tax PaymentQuarterly Tax Payment - A non-reversible IRS tax payment that Abound submits. Quarterly tax payments are initiated by calling the Tax Payments API endpoint.:

1. Create a User

A 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. is the individual for whom you will be submitting the tax payment. Below is a code snippet you would use to create a 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. within Abound with the required fields needed to submit the tax payment.

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": "Sam",
        "lastName": "Wilson",
        "address": "1500 Pennsylvania Ave NW",
        "address2": "Suite 1776",
        "city": "Washington",
        "state": "DC",
        "zipcode": "20220",
        "phoneNumber": "2026229979",
        "dateOfBirth": "1776-07-04",
        "socialSecurityNumber": "123456789"
      }
    }
  }'
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: "Sam",
      lastName: "Wilson",
      address: "1500 Pennsylvania Ave NW",
      address2: "Suite 1776",
      city: "Washington",
      state: "DC",
      zipcode: "20220",
      phoneNumber: "2026229979",
      dateOfBirth: "1776-07-04",
      socialSecurityNumber: "123456789",
    },
  });

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

url = "https://sandbox-api.withabound.com/v2/users"

payload = {"user": {
        "profile": {
            "firstName": "Sam",
            "lastName": "Wilson",
            "address": "1500 Pennsylvania Ave NW",
            "address2": "Suite 1776",
            "city": "Washington",
            "state": "DC",
            "zipcode": "20220",
            "phoneNumber": "2026229979",
            "dateOfBirth": "1776-07-04",
            "socialSecurityNumber": "123456789"
        },
        "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", "Sam");
profile.addProperty("lastName", "Wilson");
profile.addProperty("addPropertyress", "1500 Pennsylvania Ave NW");
profile.addProperty("addPropertyress2", "Suite 1776");
profile.addProperty("city", "Washington");
profile.addProperty("state", "DC");
profile.addProperty("zipcode", "20220");
profile.addProperty("phoneNumber", "2026229979");
profile.addProperty("dateOfBirth", "1776-07-04");
profile.addProperty("socialSecurityNumber", "123456789");

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": "Sam",
                "lastName": "Wilson",
                "address": "1500 Pennsylvania Ave NW",
                "address2": "Suite 1776",
                "city": "Washington",
                "state": "DC",
                "zipcode": "20220",
                "phoneNumber": "2026229979",
                "dateOfBirth": "1776-07-04",
                "socialSecurityNumber": "123456789"
            }
        }
    }`)

    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 =  "Sam",
      lastName = "Wilson",
      address = "1500 Pennsylvania Ave NW",
      address2 = "Suite 1776",
      city = "Washington",
      state = "DC",
      zipcode = "20220",
      phoneNumber = "2026229979",
      dateOfBirth = "1776-07-04",
      socialSecurityNumber = "123456789"
    }
  }
});
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: 'Sam',
      lastName: 'Wilson',
      address: '1500 Pennsylvania Ave NW',
      address2: 'Suite 1776',
      city: 'Washington',
      state: 'DC',
      zipcode: '20220',
      phoneNumber: '2026229979',
      dateOfBirth: '1776-07-04',
      socialSecurityNumber: '123456789'
    }
  }
}

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 Payment Method

❗️

KYC verification required

When creating a paymentMethod in Abound, you are certifying that you have verified the owner of the account by adhering to federal KYC requirements. Reach out to Abound support if you have any questions.

A Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. represents the bank account from which the tax payment will be charged. For taxPayments to the IRS, Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. can be any checking or savings account that has routing and account numbers and supports ACH.

However, for taxPayments submitted to an individual state the Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. must be a checking account that supports digital checks.

Below is an example of how to create a Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. that is associated with the user you created in the previous step.

🚧

State Quarterly Tax Payments must be associated with a paymentMethod whose "accountClass" is "checking".
IRS Tax Payments may come from a paymentMethod whose "accountClass" is either "checking" or "savings"

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/v2/users/<<testUserId>>/paymentMethods \
  --header 'Authorization: Bearer <<apiKey>>' \
  --header 'Content-Type: application/json' \
  --data '{
    "paymentMethod": {
      "accountNumber": "1234567890",
      "routingNumber": "121042882",
      "accountType": "personal",
      "accountClass": "checking"
    }
  }'
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.paymentMethods.create(
    "<<testUserId>>",
    {
      accountNumber: "1234567890",
      routingNumber: "121042882",
      accountType: "personal",
      accountClass: "checking",
    }
  );

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

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

payload = {"paymentMethod": {
        "accountNumber": "1234567890",
        "routingNumber": "121042882",
        "accountType": "personal",
        "accountClass": "checking"
    }}
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 paymentMethod = new JsonObject();

paymentMethod.addProperty("accountNumber", "1234567890");
paymentMethod.addProperty("routingNumber", "121042882");
paymentMethod.addProperty("accountType", "personal");
paymentMethod.addProperty("accountClass", "checking");

requestBody.add("paymentMethod", paymentMethod);

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

    var requestBody = []byte(`{
        "paymentMethod": {
            "accountNumber": "1234567890",
            "routingNumber": "121042882",
            "accountType": "personal",
            "accountClass": "checking"
        }
    }`)

    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>>/paymentMethods");
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 {
  paymentMethod = new {
    accountNumber = "1234567890",
    routingNumber = "121042882",
    accountType = "personal",
    accountClass = "checking"
  }
});
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'
require 'json'

url = URI("https://sandbox-api.withabound.com/v2/users/<<testUserId>>/paymentMethods")
requestBody = {
  paymentMethod: {
    accountNumber: '1234567890',
    routingNumber: '121042882',
    accountType: 'personal',
    accountClass: 'checking'
  }
}

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 a Quarterly Tax Payment

The Quarterly Tax PaymentQuarterly Tax Payment - A non-reversible IRS tax payment that Abound submits. Quarterly tax payments are initiated by calling the Tax Payments API endpoint. represents the actual submission of money from the Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. to the IRS (or other government entity) on behalf of a 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..

Below is an example of the creation of a Quarterly Tax PaymentQuarterly Tax Payment - A non-reversible IRS tax payment that Abound submits. Quarterly tax payments are initiated by calling the Tax Payments API endpoint. for the 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., where the funds are pulled from the Payment MethodPayment Method - A bank account (checking or savings) from which your user's withholding transfers are pulled, or withdrawal transfers are returned. Each payment method has a unique paymentMethodId. returned in the previous step and designated by the paymentMethodId.

curl \
  --request POST \
  --url https://sandbox-api.withabound.com/v2/users/<<testUserId>>/taxPayments \
  --header 'Authorization: Bearer <<apiKey>>' \
  --header 'Content-Type: application/json' \
  --data '{
    "taxPayment": {
      "amount": 87.34,
      "period": "Q2",
      "year": "2020",
      "entity": "IRS",
      "paymentMethodId": "<<testPaymentMethodId>>"
    }
  }'
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.taxPayments.create(
    "<<testUserId>>",
    {
      amount: 87.34,
      period: "Q2",
      year: "2020",
      entity: "IRS",
      paymentMethodId:
        "<<testPaymentMethodId>>",
    }
  );

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

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

payload = {"taxPayment": {
        "amount": 87.34,
        "period": "Q2",
        "year": "2020",
        "entity": "IRS",
        "paymentMethodId": "<<testPaymentMethodId>>"
    }}
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 taxPayment = new JsonObject();

taxPayment.addProperty("amount", 87.34);
taxPayment.addProperty("period", "Q2");
taxPayment.addProperty("year", "2020");
taxPayment.addProperty("entity", "IRS");
taxPayment.addProperty("paymentMethodId", "<<testPaymentMethodId>>");

requestBody.add("taxPayment", taxPayment);

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

    var requestBody = []byte(`{
        "taxPayment": {
            "amount": 87.34,
            "period": "Q2",
            "year": "2020",
            "entity": "IRS",
            "paymentMethodId": "<<testPaymentMethodId>>"
        }
    }`)

    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>>/taxPayments");
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 {
  taxPayment = new {
    amount = 87.34,
    period = "Q2",
    year = "2020",
    entity = "IRS",
    paymentMethodId = "<<testPaymentMethodId>>"
  }
});
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'
require 'json'

url = URI("https://sandbox-api.withabound.com/v2/users/<<testUserId>>/taxPayments")
requestBody = {
  taxPayment: {
    amount: 87.34,
    period: 'Q2',
    year: '2020',
    entity: 'IRS',
    paymentMethodId: '<<testPaymentMethodId>>'
  }
}

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

Congrats! You’ve initiated your first Quarterly Tax PaymentQuarterly Tax Payment - A non-reversible IRS tax payment that Abound submits. Quarterly tax payments are initiated by calling the Tax Payments API endpoint. for a 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. in Sandbox.

Next, learn how to go live with your quarterly tax payments.


Did this page help you?