Skip to content

Updating 1099-INT Statements

Use the updateF1099intStatements mutation to update data on existing 1099-INT 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 1099-INT. Full documentation for the query is available as part of the introspective GraphQL documentation.

mutation {
  updateF1099intStatements(
    statements: [
      {
        uploaderId: "18111"
        statement: { 
          interestIncome: "14957.98"
          federalTaxWithheld: "4437.44"
        }
      }
      {
        uploaderId: "18112"
        statement: {
          interestSavingsBonds: "4346.06"
          recipientFirstName: "Selina"
          recipientLastName: "Weicht"
        }
      }
    ]
  ) {
    errors
    statements {
      recordNumber
      statement {
        otxId
        uploaderId
        recipientFirstName
        recipientLastName
        interestIncome
        federalTaxWithheld
        interestSavingsBonds
      }
      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 {
          updateF1099intStatements(
            statements: [
              {
                uploaderId: \"18111\"
                statement: { 
                  interestIncome: \"14957.98\"
                  federalTaxWithheld: \"4437.44\"
                }
              }
              {
                uploaderId: \"18112\"
                statement: {
                  interestSavingsBonds: \"4346.06\"
                  recipientFirstName: \"Selina\"
                  recipientLastName: \"Weicht\"
                }
              }
            ]
          ) {
            errors
            statements {
              recordNumber
              statement {
                otxId
                uploaderId
                recipientFirstName
                recipientLastName
                interestIncome
                federalTaxWithheld
                interestSavingsBonds
              }
              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 { ^
          updateF1099intStatements( ^
            statements: [ ^
              { ^
                uploaderId: \\\"18111\\\" ^
                statement: { ^
                  interestIncome: \\\"14957.98\\\" ^
                  federalTaxWithheld: \\\"4437.44\\\" ^
                } ^
              } ^
              { ^
                uploaderId: \\\"18112\\\" ^
                statement: { ^
                  interestSavingsBonds: \\\"4346.06\\\" ^
                  recipientFirstName: \\\"Selina\\\" ^
                  recipientLastName: \\\"Weicht\\\" ^
                } ^
              } ^
            ] ^
          ) { ^
            errors ^
            statements { ^
              recordNumber ^
              statement { ^
                otxId ^
                uploaderId ^
                recipientFirstName ^
                recipientLastName ^
                interestIncome ^
                federalTaxWithheld ^
                interestSavingsBonds ^
              } ^
              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.UpdateF1099intStatementsResponse;

public class StatementUpdater {

  String endpoint = "https://sandbox.ottertax.com/v2/graphql";
  String gql = String.join("\n",
                           "mutation {",
                           "  updateF1099intStatements(",
                           "    statements: [",
                           "      {",
                           "        uploaderId: \"18111\"",
                           "        statement: { ",
                           "          interestIncome: \"14957.98\"",
                           "          federalTaxWithheld: \"4437.44\"",
                           "        }",
                           "      }",
                           "      {",
                           "        uploaderId: \"18112\"",
                           "        statement: {",
                           "          interestSavingsBonds: \"4346.06\"",
                           "          recipientFirstName: \"Selina\"",
                           "          recipientLastName: \"Weicht\"",
                           "        }",
                           "      }",
                           "    ]",
                           "  ) {",
                           "    errors",
                           "    statements {",
                           "      recordNumber",
                           "      statement {",
                           "        otxId",
                           "        uploaderId",
                           "        recipientFirstName",
                           "        recipientLastName",
                           "        interestIncome",
                           "        federalTaxWithheld",
                           "        interestSavingsBonds",
                           "      }",
                           "      messages",
                           "    }",
                           "  }",
                           "}");

  public String querify(String rawGraphql) {
    Gson gson = new Gson();
    return("{\"query\":" + gson.toJson(rawGraphql) + "}");
  }

  public void update() {
    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);
    }
    UpdateF1099intStatementsResponse updateF1099intStatementsResponse = gson.fromJson(response, UpdateF1099intStatementsResponse.class);
    System.out.println(gson.toJson(updateF1099intStatementsResponse));
  }

  public static void main(String[] args) {
    StatementUpdater statementUpdater = new StatementUpdater();
    statementUpdater.update();
  }

}
// 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 {
      updateF1099intStatements(
        statements: [
          {
            uploaderId: "18111"
            statement: { 
              interestIncome: "14957.98"
              federalTaxWithheld: "4437.44"
            }
          }
          {
            uploaderId: "18112"
            statement: {
              interestSavingsBonds: "4346.06"
              recipientFirstName: "Selina"
              recipientLastName: "Weicht"
            }
          }
        ]
      ) {
        errors
        statements {
          recordNumber
          statement {
            otxId
            uploaderId
            recipientFirstName
            recipientLastName
            interestIncome
            federalTaxWithheld
            interestSavingsBonds
          }
          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 {
    updateF1099intStatements(
      statements: [
        {
          uploaderId: "18111"
          statement: { 
            interestIncome: "14957.98"
            federalTaxWithheld: "4437.44"
          }
        }
        {
          uploaderId: "18112"
          statement: {
            interestSavingsBonds: "4346.06"
            recipientFirstName: "Selina"
            recipientLastName: "Weicht"
          }
        }
      ]
    ) {
      errors
      statements {
        recordNumber
        statement {
          otxId
          uploaderId
          recipientFirstName
          recipientLastName
          interestIncome
          federalTaxWithheld
          interestSavingsBonds
        }
        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 {
      updateF1099intStatements(
        statements: [
          {
            uploaderId: "18111"
            statement: { 
              interestIncome: "14957.98"
              federalTaxWithheld: "4437.44"
            }
          }
          {
            uploaderId: "18112"
            statement: {
              interestSavingsBonds: "4346.06"
              recipientFirstName: "Selina"
              recipientLastName: "Weicht"
            }
          }
        ]
      ) {
        errors
        statements {
          recordNumber
          statement {
            otxId
            uploaderId
            recipientFirstName
            recipientLastName
            interestIncome
            federalTaxWithheld
            interestSavingsBonds
          }
          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 {
    updateF1099intStatements(
      statements: [
        {
          uploaderId: "18111"
          statement: { 
            interestIncome: "14957.98"
            federalTaxWithheld: "4437.44"
          }
        }
        {
          uploaderId: "18112"
          statement: {
            interestSavingsBonds: "4346.06"
            recipientFirstName: "Selina"
            recipientLastName: "Weicht"
          }
        }
      ]
    ) {
      errors
      statements {
        recordNumber
        statement {
          otxId
          uploaderId
          recipientFirstName
          recipientLastName
          interestIncome
          federalTaxWithheld
          interestSavingsBonds
        }
        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