NEB's public Tm API allows programmatic access under our Terms of Service to the NEB Tm calculator for incorporation in automated high throughput primer design workflows. The calculator is intended for use in estimating the optimal annealing temperature for PCR with NEB polymerases. Tm values are calculated using thermodynamic data from Santa Lucia [1] and the salt correction of Owczarzy [2]. For Phusion® DNA Polymerases, the salt correction of Schildkraut [2] is used. For additional details, visit the Help Page of the NEB Tm Calculator.

  1. SantaLucia (1998) PNAS 95:1460-5
  2. Owczarzy et al (2004) Biochem 43:3537-54

Links to Sections

Usage

Back to top

The API is accessible via GET and POST requests to https://tmapi.neb.com. For POST requests, the input is expected to be in serialized JSON format including an HTTP 'content-type' header with a value of 'application/json'.. Request URI formats are listed below. There are 3 'general purpose' requests and 8 specialized polymerase-specific 'shortcut' requests. The former must be used if specifying a custom monovalent ion concentration instead of a standard NEB polymerase/kit/buffer. A batch option is included as one of the general requests. Output is returned as JSON. The length of the output can be controlled using a 'fmt' parameter (except for batch requests). In addition, there are 2 documentation requests that return product codes and an Open API schema in JSON format, respectively. Detailed tables covering each request category and specifications for each type of output are available below.

API endpoint results are returned as serialized JSON objects. All response objects will contain a 'success' attibute that indicates if the request was completed, a 'data' attribute (possibly empty) that contains the bulk of the response content, and a 'meta' attribute that includes the API version number, a date/timestamp, and the URL used to submit the request. Unsuccsessful requests should contain an error attribute in the response indicating the nature of the error. Output formats are shown below. API endpoints will return an HTTP status code of 200 for succesfully executed requests and 400 for unnsuccessful requests (incomplete or erroneous). Malformed requests may result in a 404 status code as well. Standard 5xx error codes will be returned by the server if the API is non-functional.

Tips

Back to top

For highest throughput, a POST batch request to /tm/batch is recommended, assuming all calculations are using the same primer concentration and buffer conditions. Sequence IDs are not used at this time, so there are no IDs available in the results; however, the primer sequence is included in the results, and the order of the results is identical to the input order of the sequences in the request.

If a custom buffer condition is needed, use the /tm endpoint, specifying the prodcode as 'custom' and supplying a value for monosalt (mM). In all other cases, monosalt is ignored. The Ta calculated for 'custom' requests is a generic value of 5°C below the lower Tm value.

Notes (e.g. 'Tm difference greater than 5 degrees') are only included in the result when using the /tm endpoint and specifying 'fmt' as 'long'.

In most cases, the second primer sequence (seq2) can be omitted, even for batch requests. The result will only contain a Tm for seq1, and no Ta will be calculated.

Up to 3 ambiguous base codes are allowed per primer sequence. When present, all possible expanded sequences are calculated and min/max Tm values for the set are reported. In these cases, Ta calculations use the min Tm values.

A machine-readable Swagger/OpenAPI v3-compliant specification is available at /docs/reference.

Input Format and Parameters

Back to top

Parameters

Name Description Type Allowed
prodcode product code representing enzyme/kit/buffer Text values available via GET /docs/productcodes
conc primer concentration (mM) Float > 0
seq1 primer 1 sequence Text [acgturyswmkbdhvn ], min length 8, max length 100
seq2 primer 2 sequence Text [acgturyswmkbdhvn ], min length 8, max length 100
seqpairs array of array of seq pairs for batch request only [ [Text,Text], ... ] [acgturyswmkbdhvn ], min length 8, max length 100, seq2 of pair is optional, max pairs per request is 1000
monosalt equivalent total monovalent Na+ concentration (mM) - used when prodcode is 'custom' - defaults to 50 Float > 0
fmt format of output (defaults to short) Text long, short
email contact email address of user Text valid email address

General Requests

Back to top
Method URI Description Required Parameters Optional Parameters
POST /tm Tm, any product code prodcode, conc, seq1 seq2, monosalt (when prodcode is 'custom'), email, fmt
Example JSON to post: {"seq1": "AGCGGATAACAATTTCACACAGGA","seq2": "GTA AAA CGA CGG CCA GT","conc": 0.5,"prodcode": "q5-0", "email": "tmapi@neb.com", "fmt": "long"} Include HTTP 'content-type' header with a value of 'application/json'.
GET /tm?<query str> Tm, any product code prodcode, conc, seq1 seq2, monosalt (when prodcode is 'custom'), email, fmt
Example: https://tmapi.neb.com/tm?seq1=AGCGGATAACAATTTCACACAGGA&seq2=GTA%20AAA%20CGA%20CGG%20CCA%20GT&conc=0.5&prodcode=q5-0&email=tmapi@neb.com
Example: https://tmapi.neb.com/tm?seq1=AGCGGATAACAATTTCACACAGGA&seq2=GTAAAACGACGGCCAGT&conc=0.5&prodcode=custom&monosalt=50&email=tmapi@neb.com
POST /tm/batch + JSON Tm, batch request, any product code prodcode, conc, seqpairs monosalt (when prodcode is 'custom'), email
Example JSON to post: {"seqpairs": [["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"],["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"]],"conc": 0.5,"prodcode": "q5-0", "email": "tmapi@neb.com"}

Shortcut Requests

Back to top
Method URI Polymerase Required Parameters Optional Parameters
GET /tm/q5u/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" Q5U HS conc, seq1 seq2, email, fmt
GET /tm/q5/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" Q5/Q5 HS conc, seq1 seq2, email, fmt
GET /tm/phusion/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" Phusion/Phusion HS Flex conc, seq1 seq2, email, fmt
GET /tm/onetaq_std/{conc}/{seq1}/{seq2}?email={email}&fmt={short|long}" OneTaq/OneTaq HS - Std buffer conc, seq1 seq2, email, fmt
GET /tm/onetaq_gc/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" OneTaq/OneTaq HS - GC buffer conc, seq1 seq2, email, fmt
GET /tm/taq/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" Taq/HS Taq/EpiMark HS Taq conc, seq1 seq2, email, fmt
GET /tm/lataq/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" LongAmp/LongAmp HS Taq conc, seq1 seq2, email, fmt
GET /tm/hktaq/{conc}/{seq1}/{seq2}/?email={email}&fmt={short|long}" Hemo KlenTaq conc, seq1 seq2, email, fmt
GET /tm/vent/{conc}/{seq1}/{seq2}?email={email}&fmt={short|long} Vent/Deep Vent conc, seq1 seq2, email, fmt
Example: https://tmapi.neb.com/tm/q5/0.5/AGCGGATAACAATTTCACACAGGA/GTA%20AAA%20CGA%20CGG%20CCA%20GT?email=tmapi@neb.com

Documentation Requests

Back to top
Method URI Description Required Parameters Optional Parameters
GET /tm/docs/productcodes Valid prodcode values n/a n/a
Example: https://tmapi.neb.com/docs/productcodes
GET /docs/reference Open API/Swagger compliant schema (json) n/a n/a
Example: https://tmapi.neb.com/docs/reference

Output Formats

Back to top

Output format - JSON - Long Tm


{
    "success": BOOLEAN",
    "data": {
    	"conc": FLOAT,
        "p1": [
	        {
	            "tm": INT (melting temp °C),
	            "fgc": FLOAT (fractional GC content),
	            "len": INT,
	            "seq": TEXT
	        },
	        ...
	    ],
        "p2": [
	        {
	            "tm": INT (melting temp °C),
	            "fgc": FLOAT (fractional GC content),
	            "len": INT,
	            "seq": TEXT
	        },
	        ...
	    ],
	    "ta": INT (annealing temp °C),
        "t1min": INT (p1 min melting temp °C),
        "t1max": INT (p1 max melting temp °C),
        "t2min": INT (p2 min melting temp °C),
        "t2max": INT (p2 max melting temp °C),
        "notes": [
            Array of text
        ]
    },
    "meta": {
        "datetime": TEXT,
        "version": TEXT,
        "url": TEXT
    }
}
			

Output format - JSON - Short Tm


{
    "success": BOOLEAN,
    "data": {
        "tm1": INT,
        "tm2": INT,
        "tm1min": INT,
        "tm2min": INT,
        "tm1max": INT,
        "tm2max": INT,
        "ta": INT
    },
    "meta": {
        "datetime": TEXT (ISO-8601 format),
        "version": TEXT,
        "url": TEXT
    }
}
			

Output format - JSON - Batch Tm


{
    "success": BOOLEAN,
    "data": [
        {
        	"seq1": TEXT,
        	"tm1": INT,
        	"tm1min": INT,
        	"tm1max": INT,
        	"seq2": TEXT, 
        	"tm2": INT, 
        	"tm2min": INT, 
        	"tm2max": INT, 
        	"ta": INT 
        },
        ...
    ],
    "meta": {
        "datetime": TEXT,
        "version": TEXT,
        "url": TEXT
    }
}
			

Output format - JSON - productcodes request


{
    "success": BOOLEAN,
    "data": [
        {
            "prodcode": TEXT,
            "name": TEXT,
            "catalog": TEXT (catalog #, if applicable)
        },
        ...
    ],
    "meta": {
        "datetime": TEXT,
        "version": TEXT,
        "url": TEXT
    }
}
			

Output format - JSON - Errors


{
    "success": BOOLEAN,
    "data": {},
    "error": TEXT,
    "meta": {
        "datetime": TEXT (ISO-8601 format),
        "version": TEXT,
        "url": TEXT
    }
}
			

Sample Code

Back to top

Sample code - curl

GET example
curl -X GET "https://tmapi.neb.com/tm/q5/0.5/AGCGGATAACAATTTCACACAGGA/GTAAAACGACGGCCAGT?email=tmapi@neb.com&fmt=long" -H "accept: application/json"
				

Sample code - Javascript

GET example
const request = require('request');

let url = 'https://tmapi.neb.com/tm/q5/0.5/AGCGGATAACAATTTCACACAGGA/GTA%20AAA%20CGA%20CGG%20CCA%20GT';

let options = {  
    url: url,
    method: 'GET'
};

request(options, (err, res, body) => {  
	if (err) { return console.log(err); }
    let json = JSON.parse(body);
    if (json.success) { 
        let r = json.data;
        console.log(`Tm1: ${r.tm1} Tm2: ${r.tm2} Ta: ${r.ta}`);
	} else {
        console.log('request failed');
        console.log(json.error[0]);
    }
});
				
POST example
const request = require('request');

let url = 'https://tmapi.neb.com/tm/batch';
let seqpairs = [
    ["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"],
    ["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"]
];
options = {  
    url: url,
    method: 'POST',
    body: JSON.stringify({
        'seqpairs': seqpairs,
        'conc': 0.5,
        'prodcode': 'q5-0'
    }),
    headers: {'content-type' : 'application/json'}
};

request(options, (err, res, body) => {  
    if (err) { return console.log(err); }
    let json = JSON.parse(body);
    if (json.success) { 
    	let r = json.data;
        for (let i = 0; i < r.length; ++i) {
            console.log(`Seq1: ${r[i].seq1} Tm1: ${r[i].tm1} Seq2: ${r[i].seq2} Tm2: ${r[i].tm2} Ta: ${r[i].ta}`);
        }
        
    } else {
        console.log('request failed');
        console.log(json.error[0]);
    }
});
				

Sample code - Python 2.7

GET example
import requests
import json

url = 'https://tmapi.neb.com/tm/q5/0.5/AGCGGATAACAATTTCACACAGGA/GTA%20AAA%20CGA%20CGG%20CCA%20GT'
res = requests.get(url)

r = json.loads(res.content)

if r['success']:
    print 'Tm1: {}  Tm2: {} Ta: {}'.format(r['data']['tm1'], r['data']['tm2'], r['data']['ta'])
else:
    print 'request failed'
    print r['error'][0]
				
POST example
import requests
import json

url = 'https://tmapi.neb.com/tm/batch'
seqpairs = [
	["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"],
	["AGCGGATAACAATTTCACACAGGA","GTAAAACGACGGCCAGT"]
]
input = {
    "seqpairs": seqpairs,
    'conc': 0.5,
    'prodcode': 'q5-0'
}
headers = {'content-type' : 'application/json'}
res = requests.post(url, data=json.dumps(input), headers=headers)

r = json.loads(res.content)

if r['success']:
    for row in r['data']:
        print 'Seq1: {}  Tm1: {}  Seq2: {} Tm2: {}  Ta: {}'.format(row['seq1'], row['tm1'], row['seq2'], row['tm2'], row['ta'])
else:
    print 'request failed'
    print r['error'][0]
				

Terms of Service

Back to top

Ownership

This API is covered by one or more trademarks and/or copyrights owned or controlled by New England Biolabs, Inc (NEB). All of our rights not expressly granted by the terms of service are hereby retained. You retain your ownership and any associated rights of your own software that may integrate the NEB Tm API service (Service). While NEB develops and validates its products for various applications, the use of a product may require the user to obtain additional third party intellectual property rights for certain applications. For more information, please contact NEB's Global Business Development team at gbd@neb.com.

Access to the API

Users of the API do not require prior authorization with the exception of commercial use. Subject to the restrictions below, you are granted a non-exclusive limited license to access our API and documentation for the purpose of developing, testing and supporting your non-commercial applications that require integration with the Service. Use of the Service in commercial applications is prohibited without prior approval from NEB. For more information, please contact NEB's Global Business Development team at gbd@neb.com.

Rules of use

By using the Service you are accepting the license, and you agree not to: (A) use our API in any unlawful way; (B) access our API in ways that circumvent any security measures or probe NEB's systems or test our network vulnerability; (C) access our APIs or documentation for the purpose of replicating, reverse engineering, or otherwise deriving source code, trade secrets, or know-how of our Service or our Tm Calculator application; or (D) use our API in a manner that in the judgement of NEB constitutes excessive or abusive usage. We request that if you plan on making heavy use of this service you contact us first at tmapi@neb.com and let us know what we should expect.

Termination

You may terminate your obligations under the license by discontinuing use of the API. NEB reserves the right to terminate our implied contract without notice to you. Sites that abuse this resource will have their access to the API blocked based on their IP address or entire address blocks. NEB will make every effort to maintain the stability and throughput of the API and provide advance warning of changes; however, the API may be unavailable at times and is subject to change as needed.

Privacy

This application does not store any user data submitted for analysis, but does process the data on NEB servers. Server logs will contain the requestor's IP address and request URL. An option exists for providing a contact email address with each request. While not required, providing an email address will allow us to contact you in case there are problems with your request or if we are forced to block requests from your site. Email addresses are not stored or used in any other way.

Disclaimer of Liability; Limitation of Liability

THIS TOOL IS PROVIDED “AS IS” WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND. IF YOU USE THIS TOOL, YOU, ON BEHALF OF THE COMPANY OR INSTITUTION YOU REPRESENT, ASSUME THE ENTIRE RISK REGARDING USES, OUTPUTS, ANALYSIS, RESULTS AND PERFORMANCE OF THE TOOL.

Feedback

Feedback you provide regarding your use of this tool is welcome and helpful, and can be directed to tmapi@neb.com. Any feedback you provide may be used by NEB for any purpose without obligation or compensation to you.