Adding W-2 Statements¶
Use the addFw2Statements
mutation to add W-2 statements. More complete and up-to-date documentation for the addFw2Statements
mutation is available as part of the introspective GraphQL documentation.
The example mutation below illustrates adding two statements.
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: "18622.44"
recipientAddress1: "784 East 77th Street"
recipientCity: "New York"
recipientFirstName: "Leif"
recipientLastName: "Babson"
recipientState: "NY"
recipientTin: "200213492"
recipientZipCode: "10162"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "4484.17"
socialSecurityWages: "74714.16"
tags: ["group 7", "New York"]
uploaderId: "25117"
wagesTipsOtherComp: "74714.16"
}
{
federalTaxWithheld: "9685.00"
recipientAddress1: "617 West 53rd Street"
recipientAddress2: "Apartment 1022"
recipientCity: "New York"
recipientFirstName: "Anjelica"
recipientLastName: "Heximer"
recipientState: "NY"
recipientTin: "200223492"
recipientZipCode: "10019"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "2773.38"
socialSecurityWages: "44021.96"
tags: ["group 7", "New York", "send for review"]
uploaderId: "25118"
wagesTipsOtherComp: "44021.96"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
# Terminate lines with \ character to allow command to span multiple lines.
# Escape quotation marks in body of mutation or query with backslashes.
# Use here document for data stream.
# Tested using the bash interpreter on Linux.
curl 'https://sandbox.ottertax.com/v2/graphql' \
-i \
-X POST \
-H 'content-type: application/json' \
-H 'access-token: YOUR ACCESS TOKEN' \
-H 'client: YOUR CLIENT ID' \
-H 'uid: YOUR UID' \
-d @- <<END_DATA
{
"query":"
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: \"18622.44\"
recipientAddress1: \"784 East 77th Street\"
recipientCity: \"New York\"
recipientFirstName: \"Leif\"
recipientLastName: \"Babson\"
recipientState: \"NY\"
recipientTin: \"200213492\"
recipientZipCode: \"10162\"
senderAddress1: \"406 Chambers Street\"
senderCity: \"New York\"
senderName: \"Empire Savings Bank\"
senderState: \"NY\"
senderTin: \"104123456\"
senderZipCode: \"10282\"
socialSecurityTaxWithheld: \"4484.17\"
socialSecurityWages: \"74714.16\"
tags: [\"group 7\", \"New York\"]
uploaderId: \"25117\"
wagesTipsOtherComp: \"74714.16\"
}
{
federalTaxWithheld: \"9685.00\"
recipientAddress1: \"617 West 53rd Street\"
recipientAddress2: \"Apartment 1022\"
recipientCity: \"New York\"
recipientFirstName: \"Anjelica\"
recipientLastName: \"Heximer\"
recipientState: \"NY\"
recipientTin: \"200223492\"
recipientZipCode: \"10019\"
senderAddress1: \"406 Chambers Street\"
senderCity: \"New York\"
senderName: \"Empire Savings Bank\"
senderState: \"NY\"
senderTin: \"104123456\"
senderZipCode: \"10282\"
socialSecurityTaxWithheld: \"2773.38\"
socialSecurityWages: \"44021.96\"
tags: [\"group 7\", \"New York\", \"send for review\"]
uploaderId: \"25118\"
wagesTipsOtherComp: \"44021.96\"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
"
}
END_DATA
:: Terminate lines with ^ character to allow command to span multiple lines.
:: Precede quotation marks in body of mutation or query with triple backslashes.
:: Precede other quotation marks in data stream with single backslashes.
:: Tested using a command prompt on Windows 10.
curl "https://sandbox.ottertax.com/v2/graphql" ^
-i ^
-X POST ^
-H "content-type: application/json" ^
-H "access-token: YOUR ACCESS TOKEN" ^
-H "client: YOUR CLIENT ID" ^
-H "uid: YOUR UID" ^
-d "{ \"query\":\" ^
mutation { ^
addFw2Statements( ^
statements: [ ^
{ ^
federalTaxWithheld: \\\"18622.44\\\" ^
recipientAddress1: \\\"784 East 77th Street\\\" ^
recipientCity: \\\"New York\\\" ^
recipientFirstName: \\\"Leif\\\" ^
recipientLastName: \\\"Babson\\\" ^
recipientState: \\\"NY\\\" ^
recipientTin: \\\"200213492\\\" ^
recipientZipCode: \\\"10162\\\" ^
senderAddress1: \\\"406 Chambers Street\\\" ^
senderCity: \\\"New York\\\" ^
senderName: \\\"Empire Savings Bank\\\" ^
senderState: \\\"NY\\\" ^
senderTin: \\\"104123456\\\" ^
senderZipCode: \\\"10282\\\" ^
socialSecurityTaxWithheld: \\\"4484.17\\\" ^
socialSecurityWages: \\\"74714.16\\\" ^
tags: [\\\"group 7\\\", \\\"New York\\\"] ^
uploaderId: \\\"25117\\\" ^
wagesTipsOtherComp: \\\"74714.16\\\" ^
} ^
{ ^
federalTaxWithheld: \\\"9685.00\\\" ^
recipientAddress1: \\\"617 West 53rd Street\\\" ^
recipientAddress2: \\\"Apartment 1022\\\" ^
recipientCity: \\\"New York\\\" ^
recipientFirstName: \\\"Anjelica\\\" ^
recipientLastName: \\\"Heximer\\\" ^
recipientState: \\\"NY\\\" ^
recipientTin: \\\"200223492\\\" ^
recipientZipCode: \\\"10019\\\" ^
senderAddress1: \\\"406 Chambers Street\\\" ^
senderCity: \\\"New York\\\" ^
senderName: \\\"Empire Savings Bank\\\" ^
senderState: \\\"NY\\\" ^
senderTin: \\\"104123456\\\" ^
senderZipCode: \\\"10282\\\" ^
socialSecurityTaxWithheld: \\\"2773.38\\\" ^
socialSecurityWages: \\\"44021.96\\\" ^
tags: [\\\"group 7\\\", \\\"New York\\\", \\\"send for review\\\"] ^
uploaderId: \\\"25118\\\" ^
wagesTipsOtherComp: \\\"44021.96\\\" ^
} ^
] ^
) { ^
errors ^
statements { ^
recordNumber ^
statement { ^
federalTaxWithheld ^
otxId ^
uploaderId ^
recipientFirstName ^
recipientLastName ^
socialSecurityTaxWithheld ^
socialSecurityWages ^
tags ^
wagesTipsOtherComp ^
} ^
messages ^
} ^
} ^
} ^
\" }"
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// This example uses version 2.9.1 of the
// open source gson library from Google.
// See https://github.com/google/gson.
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
// This example uses httpclient (version 4.5.13)
// and httpcore (version 4.4.13) libraries of the
// open source Apache HttpComponents project.
// See https://hc.apache.org/index.html.
import org.apache.http.entity.StringEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
// Download the OtterTax java classes for the GraphQL
// query and mutation responses at
// https://github.com/OtterTax/graphql-java-classes
import com.ottertax.support.AddFw2StatementsResponse;
public class StatementAdder {
String endpoint = "https://sandbox.ottertax.com/v2/graphql";
String gql = String.join("\n",
"mutation {",
" addFw2Statements(",
" statements: [",
" {",
" federalTaxWithheld: \"18622.44\"",
" recipientAddress1: \"784 East 77th Street\"",
" recipientCity: \"New York\"",
" recipientFirstName: \"Leif\"",
" recipientLastName: \"Babson\"",
" recipientState: \"NY\"",
" recipientTin: \"200213492\"",
" recipientZipCode: \"10162\"",
" senderAddress1: \"406 Chambers Street\"",
" senderCity: \"New York\"",
" senderName: \"Empire Savings Bank\"",
" senderState: \"NY\"",
" senderTin: \"104123456\"",
" senderZipCode: \"10282\"",
" socialSecurityTaxWithheld: \"4484.17\"",
" socialSecurityWages: \"74714.16\"",
" tags: [\"group 7\", \"New York\"]",
" uploaderId: \"25117\"",
" wagesTipsOtherComp: \"74714.16\"",
" }",
" {",
" federalTaxWithheld: \"9685.00\"",
" recipientAddress1: \"617 West 53rd Street\"",
" recipientAddress2: \"Apartment 1022\"",
" recipientCity: \"New York\"",
" recipientFirstName: \"Anjelica\"",
" recipientLastName: \"Heximer\"",
" recipientState: \"NY\"",
" recipientTin: \"200223492\"",
" recipientZipCode: \"10019\"",
" senderAddress1: \"406 Chambers Street\"",
" senderCity: \"New York\"",
" senderName: \"Empire Savings Bank\"",
" senderState: \"NY\"",
" senderTin: \"104123456\"",
" senderZipCode: \"10282\"",
" socialSecurityTaxWithheld: \"2773.38\"",
" socialSecurityWages: \"44021.96\"",
" tags: [\"group 7\", \"New York\", \"send for review\"]",
" uploaderId: \"25118\"",
" wagesTipsOtherComp: \"44021.96\"",
" }",
" ]",
" ) {",
" errors",
" statements {",
" recordNumber",
" statement {",
" federalTaxWithheld",
" otxId",
" uploaderId",
" recipientFirstName",
" recipientLastName",
" socialSecurityTaxWithheld",
" socialSecurityWages",
" tags",
" wagesTipsOtherComp",
" }",
" messages",
" }",
" }",
"}");
public String querify(String rawGraphql) {
Gson gson = new Gson();
return("{\"query\":" + gson.toJson(rawGraphql) + "}");
}
public void add() {
CloseableHttpClient httpClient = HttpClients.createDefault();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String response = "";
try {
HttpPost httpPost = new HttpPost(endpoint);
httpPost.addHeader("content-type", "application/json");
httpPost.addHeader("access-token", "YOUR ACCESS TOKEN");
httpPost.addHeader("client", "YOUR CLIENT ID");
httpPost.addHeader("uid", "YOUR UID");
// Put the query in the post body.
StringEntity stringEntity = new StringEntity(querify(gql));
httpPost.setEntity(stringEntity);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
// Read the response.
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
StringBuffer responseBuffer = new StringBuffer();
String inputLine;
while ((inputLine = reader.readLine()) != null) {
responseBuffer.append(inputLine);
}
reader.close();
response = responseBuffer.toString();
int responseCode = httpResponse.getStatusLine().getStatusCode();
if( responseCode != 200 ) {
System.out.println("Response code from server was " + String.valueOf(responseCode) + ".");
}
httpResponse.close();
httpClient.close();
} catch(IOException e) {
System.out.println("Error posting GraphQL.\nExiting");
System.exit(1);
}
AddFw2StatementsResponse addFw2StatementsResponse = gson.fromJson(response, AddFw2StatementsResponse.class);
System.out.println(gson.toJson(addFw2StatementsResponse));
}
public static void main(String[] args) {
StatementAdder statementAdder = new StatementAdder();
statementAdder.add();
}
}
// Using graphql-request from
// https://github.com/prisma-labs/graphql-request
// Example tested with node version 16.16.0
import { GraphQLClient, gql } from 'graphql-request'
async function main() {
const endpoint = 'https://sandbox.ottertax.com/v2/graphql'
const graphQLClient = new GraphQLClient(endpoint, {
headers: { 'content-type': 'application/json',
'access-token': 'YOUR ACCESS TOKEN',
'client': 'YOUR CLIENT ID',
'uid': 'YOUR UID' }
})
const query = gql`
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: "18622.44"
recipientAddress1: "784 East 77th Street"
recipientCity: "New York"
recipientFirstName: "Leif"
recipientLastName: "Babson"
recipientState: "NY"
recipientTin: "200213492"
recipientZipCode: "10162"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "4484.17"
socialSecurityWages: "74714.16"
tags: ["group 7", "New York"]
uploaderId: "25117"
wagesTipsOtherComp: "74714.16"
}
{
federalTaxWithheld: "9685.00"
recipientAddress1: "617 West 53rd Street"
recipientAddress2: "Apartment 1022"
recipientCity: "New York"
recipientFirstName: "Anjelica"
recipientLastName: "Heximer"
recipientState: "NY"
recipientTin: "200223492"
recipientZipCode: "10019"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "2773.38"
socialSecurityWages: "44021.96"
tags: ["group 7", "New York", "send for review"]
uploaderId: "25118"
wagesTipsOtherComp: "44021.96"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
`
const data = await graphQLClient.request(query)
console.log(JSON.stringify(data))
}
main().catch((error) => console.error(error))
<?php
// Tested with php-cli version 8.1.2.
$query =<<<'END_DATA'
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: "18622.44"
recipientAddress1: "784 East 77th Street"
recipientCity: "New York"
recipientFirstName: "Leif"
recipientLastName: "Babson"
recipientState: "NY"
recipientTin: "200213492"
recipientZipCode: "10162"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "4484.17"
socialSecurityWages: "74714.16"
tags: ["group 7", "New York"]
uploaderId: "25117"
wagesTipsOtherComp: "74714.16"
}
{
federalTaxWithheld: "9685.00"
recipientAddress1: "617 West 53rd Street"
recipientAddress2: "Apartment 1022"
recipientCity: "New York"
recipientFirstName: "Anjelica"
recipientLastName: "Heximer"
recipientState: "NY"
recipientTin: "200223492"
recipientZipCode: "10019"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "2773.38"
socialSecurityWages: "44021.96"
tags: ["group 7", "New York", "send for review"]
uploaderId: "25118"
wagesTipsOtherComp: "44021.96"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
END_DATA;
$payload = array ('query' => $query);
$options = array(
'http' => array(
'method' => 'POST',
'content' => json_encode( $payload ),
'header' => "content-type: application/json\r\n" .
"access-token: YOUR ACCESS TOKEN\r\n" .
"client: YOUR CLIENT ID\r\n" .
"uid: YOUR UID\r\n"
)
);
$context = stream_context_create( $options );
$response = file_get_contents( 'https://sandbox.ottertax.com/v2/graphql',
false, $context );
if( $response === FALSE ) {
echo "Call to server failed.\n";
} else {
echo $response . "\n";
}
?>
# Using GQL from
# https://github.com/graphql-python/gql
# Tested using python version 3.10.4
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport
transport = AIOHTTPTransport(url = "https://sandbox.ottertax.com/v2/graphql",
headers = { 'content-type': 'application/json',
'access-token': 'YOUR ACCESS TOKEN',
'client': 'YOUR CLIENT ID',
'uid': 'YOUR UID' })
client = Client(transport=transport, fetch_schema_from_transport=True)
query = gql(
"""
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: "18622.44"
recipientAddress1: "784 East 77th Street"
recipientCity: "New York"
recipientFirstName: "Leif"
recipientLastName: "Babson"
recipientState: "NY"
recipientTin: "200213492"
recipientZipCode: "10162"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "4484.17"
socialSecurityWages: "74714.16"
tags: ["group 7", "New York"]
uploaderId: "25117"
wagesTipsOtherComp: "74714.16"
}
{
federalTaxWithheld: "9685.00"
recipientAddress1: "617 West 53rd Street"
recipientAddress2: "Apartment 1022"
recipientCity: "New York"
recipientFirstName: "Anjelica"
recipientLastName: "Heximer"
recipientState: "NY"
recipientTin: "200223492"
recipientZipCode: "10019"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "2773.38"
socialSecurityWages: "44021.96"
tags: ["group 7", "New York", "send for review"]
uploaderId: "25118"
wagesTipsOtherComp: "44021.96"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
"""
)
result = client.execute(query)
print(result)
# Tested using ruby 3.1.2.
require( 'net/http' )
require( 'uri' )
require( 'json' )
uri = URI( "https://sandbox.ottertax.com/v2/graphql" )
http = Net::HTTP.new(uri.host, uri.port)
if( uri.instance_of?( URI::HTTPS ) )
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
headers = { "content-type": "application/json",
"access-token": "YOUR ACCESS TOKEN",
"client": "YOUR CLIENT ID",
"uid": "YOUR UID" }
query = <<-END_DATA
mutation {
addFw2Statements(
statements: [
{
federalTaxWithheld: "18622.44"
recipientAddress1: "784 East 77th Street"
recipientCity: "New York"
recipientFirstName: "Leif"
recipientLastName: "Babson"
recipientState: "NY"
recipientTin: "200213492"
recipientZipCode: "10162"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "4484.17"
socialSecurityWages: "74714.16"
tags: ["group 7", "New York"]
uploaderId: "25117"
wagesTipsOtherComp: "74714.16"
}
{
federalTaxWithheld: "9685.00"
recipientAddress1: "617 West 53rd Street"
recipientAddress2: "Apartment 1022"
recipientCity: "New York"
recipientFirstName: "Anjelica"
recipientLastName: "Heximer"
recipientState: "NY"
recipientTin: "200223492"
recipientZipCode: "10019"
senderAddress1: "406 Chambers Street"
senderCity: "New York"
senderName: "Empire Savings Bank"
senderState: "NY"
senderTin: "104123456"
senderZipCode: "10282"
socialSecurityTaxWithheld: "2773.38"
socialSecurityWages: "44021.96"
tags: ["group 7", "New York", "send for review"]
uploaderId: "25118"
wagesTipsOtherComp: "44021.96"
}
]
) {
errors
statements {
recordNumber
statement {
federalTaxWithheld
otxId
uploaderId
recipientFirstName
recipientLastName
socialSecurityTaxWithheld
socialSecurityWages
tags
wagesTipsOtherComp
}
messages
}
}
}
END_DATA
request = Net::HTTP::Post.new(uri.request_uri, headers )
request.body = {query: query}.to_json
response = http.request(request)
if( response.code == '200' )
payload = JSON.parse( response.body )
STDOUT.puts( payload )
else
STDOUT.puts( "Response code was #{response.code}:\n#{response.inspect}" )
end