Prerequisites

  1. Get Approval for EFTPS Enrollment

The first time Abound® submits a tax payment for each of your users, you will need to receive approval for Abound® to enroll that User with EFTPS. The enrollment process is managed by Abound®. You simply need to display the authorization process described in the Representative Approval for EFTPS Enrollment guide.

📘

Production Authorization

Contact Abound® support to receive approval of your authorization to enable your production environment.

  1. Create a Payment Method

Before creating a payment method, you must create a User. The user is the individual for whom you will be submitting the payment request. To create a User, you can follow the Getting Started guide.

KYC verification required

When creating a paymentMethod in Abound®, you are certifying that you have verified the owner of the payment account by adhering to federal KYC requirements.

A Payment Method represents the bank account from which the tax payment will be charged. For a taxPayment to the IRS, a Payment Method may be any checking or savings account that has a routing and account number that supports ACH.

Below is an example of how to create a Payment Method that is associated with the user you created in the previous step.

📘

paymentMethod for Tax Payments

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;
// import com.google.gson.JsonArray;
// 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.V2
);
Abound abound = new Abound(aboundConfig);

String userId = "<<testUserId>>";

PaymentMethodRequest paymentMethodRequest = PaymentMethodRequest.builder()
  .accountNumber("1234567890")
  .routingNumber("121042882")
  .accountType(AccountType.BUSINESS)
  .accountClass(AccountClass.CHECKING)
  .build();

AboundResponse<PaymentMethod> response = abound.paymentMethods().create(userId, paymentMethodRequest);

System.out.println(response.getData())
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

Please ensure you are familiar with our dates and deadlines for payments