Getting Started

1: Retrieve Your API Keys

Create an account to start integrating our APIs into your solution. You can retrieve your API Keys from the dashboard or from the standalone API Keys page.

2: API Authentication

Authentication requires passing your Authentication Bearer token for the desired environment (sandbox or production) in the header of your API request.

The following is an example request that returns all users with the required authentication headers. Simply replace ${appId} and ${appSecret} with your corresponding API keys, which you can find in the API dashboard.

curl \
--request GET \
--url https://sandbox-api.withabound.com/<<apiVersion>>/users \
--header 'Authorization: Bearer <<apiKey>>'
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.list();
  console.log(response);
})();
import requests

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

headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <<apiKey>>"
}

response = requests.request("GET", url, headers=headers)

print(response.text)
//import java.io.IOException;
//import com.google.gson.Gson;

//import com.withabound.*;
//import com.withabound.models.users.User;
//import com.withabound.resources.base.AboundBulkResponse;

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

Abound abound = new Abound(aboundConfig);
AboundBulkResponse<User> response;
try {
  response = abound.users().list();
  Gson gson = new Gson();
  String json = gson.toJson(response.getData());
  System.out.println(json);
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
package main

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

func main() {

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

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Accept", "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.GET);
request.AddHeader("Accept", "application/json");
request.AddHeader("Authorization", "Bearer <<apiKey>>");
IRestResponse response = client.Execute(request);
require 'uri'
require 'net/http'
require 'openssl'

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

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

request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["Authorization"] = 'Bearer <<apiKey>>'

response = http.request(request)
puts response.read_body
ValueDescription
appIdA non-sensitive, public identifier that is used to identify your app.
appSecretA sensitive, private key used to make secure calls to the Abound from your backend. Your appSecret should never be shared on the client-side or stored directly in your code.
sandbox-api.withabound.com/v3Stateful sandbox environment; use test credentials and build out and test your integration.
production-api.withabound.com/v3Production API environment; this environment is billed and will initiate real money transfers.

3: Create a User

The User is the foundational resource of every API call, which can be broken into two steps:

a. Create a User
b. Save the userId

a. Create a User

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

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: "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 java.io.IOException;

//import com.google.gson.Gson;
//import com.withabound.*;
//import com.withabound.models.users.*;
//import com.withabound.resources.base.AboundResponse;


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

Abound abound = new Abound(aboundConfig);
try {
  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());
  Gson gson = new Gson();
  String json = gson.toJson(response.getData());
  System.out.println(json);
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
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

b. Save the userId

The response from POST /users is shown below. Ensure that you save the userId to your own database for future reference.

{
  "data": {
    "userId": "<<testUserId>>",
    "email": "[email protected]"
  }
}

4: Create a Payer

The Payer is a foundational resource for 1099 Filing and Issuance, which can be broken in two steps:

a. Create a Payer
b. Save the payerId


a. 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/v2/payers';
const options = {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    Authorization: 'Bearer <<apiKey>>'
  },
  body: JSON.stringify({
    payers: [
      {
        name: "Hooli",
        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": "Hooli",
            "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 java.io.IOException;
//import java.util.Collections;

//import com.google.gson.Gson;
//import com.withabound.*;
//import com.withabound.models.payers.*;
//import com.withabound.resources.base.AboundBulkResponse;

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

Abound abound = new Abound(aboundConfig);
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();

try {
  AboundBulkResponse<Payer> response = abound.payers()
    .create(Collections.singletonList(toCreate));
  Gson gson = new Gson();
  String json = gson.toJson(response.getData());
  System.out.println(json);
package main

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

func main() {

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

    var requestBody = []byte(`{
        "payers": [
            {
                "name": "Hooli",
                "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 = "Hooli",
      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: 'Hooli',
      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

b. Save the payerId

The response from POST /payers is shown below. It's crucial that you save the payerId to your own database for future reference.

{
  "data": [
    "payerId": "<<testPayerId>>",
    "name": "Hooli",
    "address": "1401 N Shoreline Blvd",
    "address2": "Suite 1",
    "city": "Mountain View",
    "state": "CA",
    "country": "US",
    "zipcode": "94043",
    "phoneNumber": "6501014096"
  ]
}