Skip to content

Updating W-2 Statements

Use the updateFw2Statements mutation to update data on existing W-2 statements.

Note

Only statements in draft mode can be updated; statements which have been finalized cannot be updated.

The GraphQL mutation below demonstrates updating various fields on the W-2. Full documentation for the query is available as part of the introspective GraphQL documentation.

mutation {
  updateFw2Statements(
    statements: [
      {
        otxId: "2edb5f8e-50bd-4807-b5a4-942ac652d0fe"
        statement: {
          wagesTipsOtherComp: "84712.56"
          federalTaxWithheld: "22872.40"
        }
      }
      {
        otxId: "50814715-0a50-45c9-94c6-0618d9daabd2"
        statement: {
          socialSecurityWages: "47698.07"
          socialSecurityTaxWithheld: "3052.68"
        }
      }
    ]
  ) {
    statements {
      recordNumber
      statement {
        federalTaxWithheld
        otxId
        recipientFirstName
        recipientLastName
        socialSecurityTaxWithheld
        socialSecurityWages
        uploaderId
        wagesTipsOtherComp
      }
      messages
    }
    errors
  }
}

The code snippets below illustrate running the query. See the documentation on authentication for information about obtaining the credential data passed in the header.

# 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 {
          updateFw2Statements(
            statements: [
              {
                otxId: \"2edb5f8e-50bd-4807-b5a4-942ac652d0fe\"
                statement: {
                  wagesTipsOtherComp: \"84712.56\"
                  federalTaxWithheld: \"22872.40\"
                }
              }
              {
                otxId: \"50814715-0a50-45c9-94c6-0618d9daabd2\"
                statement: {
                  socialSecurityWages: \"47698.07\"
                  socialSecurityTaxWithheld: \"3052.68\"
                }
              }
            ]
          ) {
            statements {
              recordNumber
              statement {
                federalTaxWithheld
                otxId
                recipientFirstName
                recipientLastName
                socialSecurityTaxWithheld
                socialSecurityWages
                uploaderId
                wagesTipsOtherComp
              }
              messages
            }
            errors
          }
        }
      "
    }
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 { ^
          updateFw2Statements( ^
            statements: [ ^
              { ^
                otxId: \\\"2edb5f8e-50bd-4807-b5a4-942ac652d0fe\\\" ^
                statement: { ^
                  wagesTipsOtherComp: \\\"84712.56\\\" ^
                  federalTaxWithheld: \\\"22872.40\\\" ^
                } ^
              } ^
              { ^
                otxId: \\\"50814715-0a50-45c9-94c6-0618d9daabd2\\\" ^
                statement: { ^
                  socialSecurityWages: \\\"47698.07\\\" ^
                  socialSecurityTaxWithheld: \\\"3052.68\\\" ^
                } ^
              } ^
            ] ^
          ) { ^
            statements { ^
              recordNumber ^
              statement { ^
                federalTaxWithheld ^
                otxId ^
                recipientFirstName ^
                recipientLastName ^
                socialSecurityTaxWithheld ^
                socialSecurityWages ^
                uploaderId ^
                wagesTipsOtherComp ^
              } ^
              messages ^
            } ^
            errors ^
          } ^
        } ^
     \" }"
// Using graphql-request from
// https://github.com/prisma-labs/graphql-request
// Example tested with node version 14.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: {
      'access-token': 'YOUR ACCESS TOKEN',
      'client':       'YOUR CLIENT ID',
      'uid':          'YOUR UID'
    },
  })
  const query = gql`
    mutation {
      updateFw2Statements(
        statements: [
          {
            otxId: "2edb5f8e-50bd-4807-b5a4-942ac652d0fe"
            statement: {
              wagesTipsOtherComp: "84712.56"
              federalTaxWithheld: "22872.40"
            }
          }
          {
            otxId: "50814715-0a50-45c9-94c6-0618d9daabd2"
            statement: {
              socialSecurityWages: "47698.07"
              socialSecurityTaxWithheld: "3052.68"
            }
          }
        ]
      ) {
        statements {
          recordNumber
          statement {
            federalTaxWithheld
            otxId
            recipientFirstName
            recipientLastName
            socialSecurityTaxWithheld
            socialSecurityWages
            uploaderId
            wagesTipsOtherComp
          }
          messages
        }
        errors
      }
    }
  `

  const data = await graphQLClient.request(query)
  console.log(JSON.stringify(data))
}

main().catch((error) => console.error(error))
<?php
// Tested with php-cli version 8.0.5.
$query =<<<'END_DATA'
  mutation {
    updateFw2Statements(
      statements: [
        {
          otxId: "2edb5f8e-50bd-4807-b5a4-942ac652d0fe"
          statement: {
            wagesTipsOtherComp: "84712.56"
            federalTaxWithheld: "22872.40"
          }
        }
        {
          otxId: "50814715-0a50-45c9-94c6-0618d9daabd2"
          statement: {
            socialSecurityWages: "47698.07"
            socialSecurityTaxWithheld: "3052.68"
          }
        }
      ]
    ) {
      statements {
        recordNumber
        statement {
          federalTaxWithheld
          otxId
          recipientFirstName
          recipientLastName
          socialSecurityTaxWithheld
          socialSecurityWages
          uploaderId
          wagesTipsOtherComp
        }
        messages
      }
      errors
    }
  }
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.8.8
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport

transport = AIOHTTPTransport(url="https://sandbox.ottertax.com/v2/graphql",
                            headers={ 'access-token': 'YOUR ACCESS TOKEN',
                                      'client':       'YOUR CLIENT ID',
                                      'uid':          'YOUR UID' })
client = Client(transport=transport, fetch_schema_from_transport=True)
query = gql(
    """
      mutation {
        updateFw2Statements(
          statements: [
            {
              otxId: "2edb5f8e-50bd-4807-b5a4-942ac652d0fe"
              statement: {
                wagesTipsOtherComp: "84712.56"
                federalTaxWithheld: "22872.40"
              }
            }
            {
              otxId: "50814715-0a50-45c9-94c6-0618d9daabd2"
              statement: {
                socialSecurityWages: "47698.07"
                socialSecurityTaxWithheld: "3052.68"
              }
            }
          ]
        ) {
          statements {
            recordNumber
            statement {
              federalTaxWithheld
              otxId
              recipientFirstName
              recipientLastName
              socialSecurityTaxWithheld
              socialSecurityWages
              uploaderId
              wagesTipsOtherComp
            }
            messages
          }
          errors
        }
      }
    """
)

result = client.execute(query)
print(result)
# If you wish to use a library instead, see
# https://github.com/github/graphql-client
# Tested using ruby 2.7.2.
require( 'net/http' )
require( 'uri' )
require( 'json' )

uri = URI( "https://sandbox.ottertax.com/v2/graphql" )
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
headers = { 'Content-Type': 'application/json',
            'access-token': 'YOUR ACCESS TOKEN',
            'client':       'YOUR CLIENT ID',
            'uid':          'YOUR UID' }

query = <<-END_DATA
  mutation {
    updateFw2Statements(
      statements: [
        {
          otxId: "2edb5f8e-50bd-4807-b5a4-942ac652d0fe"
          statement: {
            wagesTipsOtherComp: "84712.56"
            federalTaxWithheld: "22872.40"
          }
        }
        {
          otxId: "50814715-0a50-45c9-94c6-0618d9daabd2"
          statement: {
            socialSecurityWages: "47698.07"
            socialSecurityTaxWithheld: "3052.68"
          }
        }
      ]
    ) {
      statements {
        recordNumber
        statement {
          federalTaxWithheld
          otxId
          recipientFirstName
          recipientLastName
          socialSecurityTaxWithheld
          socialSecurityWages
          uploaderId
          wagesTipsOtherComp
        }
        messages
      }
      errors
    }
  }
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