NAV
bash javascript php python

About Fee Navigator API

Fee Navigator API offers a suite of technology components to automate merchant statement analysis and comparison.

These are a subset of the full solution that Fee Navigator offers to the industry, which include the email analysis bot, Lead Funnel Unlimited, knowledge management, affiliate system, and AI-DYI capabilities when automatic analysis fails. For more information about the full solution, please visit https://www.feenavigator.com

We made this API available to help the industry produce custom experiences on top of our technology. Contact sales@feenavigator.com to get an API key and start coding!

Get Postman Collection

Authorization

Fee Navigator API ("FNAPI") uses API keys to allow access to the API. Be sure to request your key by contacting sales@feenavigator.com.

FNAPI expects the API key to be included in all API requests to the server in a header that looks like the following:

Authorization: {apiKey}

01 - Statement

This section deals with basic functions related to statements, including:

Submit Statement

Uploads a PDF statement (native or scanned) and gets an id as a result. You will use this id to perform functions on this statement.

Example request:

curl -X POST \
    "https://developer.feenavigator.com/api/v1/statements/upload" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}" \
    -d '{"pdf":"my_pdf_statement.pdf"}'
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/upload"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

let body = {
    "pdf": "my_pdf_statement.pdf"
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://developer.feenavigator.com/api/v1/statements/upload',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],

        'multipart' => [
            [
                'name' => 'pdf',
                'contents' => file_get_contents('my_pdf_statement.pdf'),
            ],
        ]
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/upload'
payload = {
    "pdf": "my_pdf_statement.pdf"
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):

{
    "id": 1755002352774017576
}

Example response (404):

{
    "errors": [
        "Not Found -- The specified resource could not be found"
    ]
}

HTTP Request

POST api/v1/statements/upload

Body Parameters

Parameter Type Status Description
pdf file required Statement PDF file.

Delete Statement

Deletes a statement and all extracted or processed information, including any associated analyses.

Example request:

curl -X DELETE \
    "https://developer.feenavigator.com/api/v1/statements/delete/1755002352774017576" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/delete/1755002352774017576"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "DELETE",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://developer.feenavigator.com/api/v1/statements/delete/1755002352774017576',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/delete/1755002352774017576'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):

[]

HTTP Request

DELETE api/v1/statements/delete/{id}

URL Parameters

Parameter Status Description
id required A valid statement ID previously obtained.

Get Extracted Text

Returns the textual representation after performing optical-character-recognition (OCR) on the PDF statement.

Depending on the quality of the document itself, this may not match 100% the PDF content.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/statements/get-extracted-text/1755002352774017576" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/get-extracted-text/1755002352774017576"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/statements/get-extracted-text/1755002352774017576',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/get-extracted-text/1755002352774017576'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

{
    "extractedText": ".... extracted text as a string ..."
}

HTTP Request

GET api/v1/statements/get-extracted-text/{id}

URL Parameters

Parameter Status Description
id required A valid statement ID previously obtained.

AI Classification

Returns the processor, platform, and ISO/MSP identified by AI.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/statements/get-ai-classification/1755002352774017576" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/get-ai-classification/1755002352774017576"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/statements/get-ai-classification/1755002352774017576',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/get-ai-classification/1755002352774017576'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

[
    {
        "name": "Processor",
        "value": "FIS"
    },
    {
        "name": "Platform",
        "value": "Worldpay-1"
    },
    {
        "name": "Iso",
        "value": "Worldpay Integrated Payments"
    }
]

HTTP Request

GET api/v1/statements/get-ai-classification/{id}

URL Parameters

Parameter Status Description
id required A valid statement ID previously obtained.

Data Points

Returns processed elements generated from the textual representation of the PDF statement.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/statements/get-datapoints/1755002352774017576" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/get-datapoints/1755002352774017576"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/statements/get-datapoints/1755002352774017576',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/get-datapoints/1755002352774017576'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

[
    {
        "name": "Processor",
        "value": "fiserv",
        "formattedValue": "fiserv"
    },
    {
        "name": "Platform",
        "value": "FD-North",
        "formattedValue": "FD-North"
    },
    {
        "name": "Iso",
        "value": "First Data",
        "formattedValue": "First Data"
    },
    {
        "name": "Merchant Name",
        "value": "B2B Sample Merchant Statement",
        "formattedValue": "B2B Sample Merchant Statement"
    },
    {
        "name": "Merchant Address",
        "value": "123 AnyStreet, CA, 90210",
        "formattedValue": "123 AnyStreet, CA, 90210"
    },
    {
        "name": "Merchant Number",
        "value": "11111111",
        "formattedValue": "11111111"
    },
    {
        "name": "Statement Period Start",
        "value": "04\/01\/18",
        "formattedValue": "04\/01\/18"
    },
    {
        "name": "Statement Period End",
        "value": "04\/30\/18",
        "formattedValue": "04\/30\/18"
    },
    {
        "name": "Pricing Type",
        "value": "IC Plus",
        "formattedValue": "IC Plus"
    },
    {
        "name": "Third Party Transactions",
        "value": 1702820.62,
        "formattedValue": "1,702,820.62"
    },
    {
        "name": "Visa Credit amount",
        "value": 373758.7,
        "formattedValue": "373,758.70"
    },
    {
        "name": "Visa Credit discRate",
        "value": 0.0008,
        "formattedValue": "0.08%"
    },
    {
        "name": "Visa Credit nrTransactions",
        "value": 237,
        "formattedValue": "237"
    },
    {
        "name": "Visa Credit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Visa Debit amount",
        "value": 226577.86,
        "formattedValue": "226,577.86"
    },
    {
        "name": "Visa Debit discRate",
        "value": 0.0008,
        "formattedValue": "0.08%"
    },
    {
        "name": "Visa Debit nrTransactions",
        "value": 191,
        "formattedValue": "191"
    },
    {
        "name": "Visa Debit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Visa Auth nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Visa Auth transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Mastercard Credit amount",
        "value": 380520.43,
        "formattedValue": "380,520.43"
    },
    {
        "name": "Mastercard Credit discRate",
        "value": 0.0008,
        "formattedValue": "0.08%"
    },
    {
        "name": "Mastercard Credit nrTransactions",
        "value": 120,
        "formattedValue": "120"
    },
    {
        "name": "Mastercard Credit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Mastercard Debit amount",
        "value": 52299.19,
        "formattedValue": "52,299.19"
    },
    {
        "name": "Mastercard Debit discRate",
        "value": 0.0008,
        "formattedValue": "0.08%"
    },
    {
        "name": "Mastercard Debit nrTransactions",
        "value": 67,
        "formattedValue": "67"
    },
    {
        "name": "Mastercard Debit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Mastercard Auth nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Mastercard Auth transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Credit amount",
        "value": 38374.34,
        "formattedValue": "38,374.34"
    },
    {
        "name": "Discover Credit discRate",
        "value": 0.0008,
        "formattedValue": "0.08%"
    },
    {
        "name": "Discover Credit nrTransactions",
        "value": 13,
        "formattedValue": "13"
    },
    {
        "name": "Discover Credit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Debit amount",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Debit discRate",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Debit nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Debit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Auth nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Discover Auth transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "American Express amount",
        "value": 1702820.62,
        "formattedValue": "1,702,820.62"
    },
    {
        "name": "American Express discRate",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "American Express nrTransactions",
        "value": 343,
        "formattedValue": "343"
    },
    {
        "name": "American Express transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "American Express Auth nrTransactions",
        "value": 374,
        "formattedValue": "374"
    },
    {
        "name": "American Express Auth transactionFee",
        "value": 0.08,
        "formattedValue": "0.0800"
    },
    {
        "name": "PIN Debit amount",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "PIN Debit discRate",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "PIN Debit nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "PIN Debit transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "EBT amount",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "EBT discRate",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "EBT nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "EBT transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Fleet Cards \/ Other amount",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Fleet Cards \/ Other discRate",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Fleet Cards \/ Other nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Fleet Cards \/ Other transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Interchange & downgrades",
        "value": 21797.82,
        "formattedValue": "21,797.82"
    },
    {
        "name": "PIN debit interchange",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Interchange optimization",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "AVS nrTransactions",
        "value": 223,
        "formattedValue": "223"
    },
    {
        "name": "AVS transactionFee",
        "value": 0.02,
        "formattedValue": "0.02"
    },
    {
        "name": "PCI compliance",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Non-PCI compliance",
        "value": 24.95,
        "formattedValue": "24.95"
    },
    {
        "name": "Batch nrTransactions",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Batch transactionFee",
        "value": null,
        "formattedValue": null
    },
    {
        "name": "Monthly",
        "value": 10.1,
        "formattedValue": "10.10"
    },
    {
        "name": "Other fees",
        "value": 47.97,
        "formattedValue": "47.97"
    },
    {
        "name": "Total Volume",
        "value": 1071530.52,
        "formattedValue": "1,071,530.52"
    },
    {
        "name": "Total Fees",
        "value": 24502.41,
        "formattedValue": "24,502.41"
    },
    {
        "name": "Card brands \/ other",
        "value": 1769.61,
        "formattedValue": "1,769.61"
    },
    {
        "name": "Processing Fees",
        "value": 847.5,
        "formattedValue": "847.50"
    },
    {
        "name": "Pass-Through Fees",
        "value": 23567.43,
        "formattedValue": "23,567.43"
    },
    {
        "name": "Calculated Other Fees",
        "value": 87.48,
        "formattedValue": "87.48"
    },
    {
        "name": "Total Calculated Fees",
        "value": 24502.41,
        "formattedValue": "24,502.41"
    },
    {
        "name": "Monthly Fees",
        "value": 24502.41,
        "formattedValue": "24,502.41"
    },
    {
        "name": "1-Year Fees",
        "value": 294028.92,
        "formattedValue": "294,028.92"
    },
    {
        "name": "3-Year Fees",
        "value": 882086.76,
        "formattedValue": "882,086.76"
    },
    {
        "name": "Effective Rate",
        "value": 0.0229,
        "formattedValue": "2.29%"
    },
    {
        "name": "Avoidable Fees",
        "value": 24.95,
        "formattedValue": "24.95"
    },
    {
        "name": "Interchange padding",
        "value": null,
        "formattedValue": null
    }
]

HTTP Request

GET api/v1/statements/get-datapoints/{id}

URL Parameters

Parameter Status Description
id required A valid statement ID previously obtained.

Download Statement

Returns the PDF statement as it was submitted.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/statements/download/1755002352774017576" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/statements/download/1755002352774017576"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/statements/download/1755002352774017576',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/statements/download/1755002352774017576'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

{
    "error": "Invalid API Key.",
    "code": 401
}

HTTP Request

GET api/v1/statements/download/{id}

URL Parameters

Parameter Status Description
id required A valid statement ID previously obtained.

02 - Analysis

This section handles elements of analysis, including:

Returns the completed analysis in Excel .xlsx format. It will include multiple tabs, based on the options selected. The typical usage is for this analysis to be further customized by the end-user to include their pricing structure and then be offered to merchants for review and acceptance.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/analysis/download/excel?id=1755002352774017576&analysis=1&summary=0&padding=1&optimization=1" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/analysis/download/excel"
);

let params = {
    "id": "1755002352774017576",
    "analysis": "1",
    "summary": "0",
    "padding": "1",
    "optimization": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/analysis/download/excel',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
        'query' => [
            'id'=> '1755002352774017576',
            'analysis'=> '1',
            'summary'=> '0',
            'padding'=> '1',
            'optimization'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/analysis/download/excel'
params = {
  'id': '1755002352774017576',
  'analysis': '1',
  'summary': '0',
  'padding': '1',
  'optimization': '1',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (404):

{
    "errors": [
        "Statement not found"
    ]
}

Example response (500):

{
    "errors": [
        "Internal Server Error -- We had a problem with our server. Try again later."
    ]
}

Example response (401):

{
    "error": "Invalid API Key.",
    "code": 401
}

HTTP Request

GET api/v1/analysis/download/excel

Query Parameters

Parameter Status Description
id required Statement id previously obtained.
analysis required Whether to return full analysis (1) or not (0).
summary required Whether to return summary analysis (1) or not (0).
padding required Whether to extract IC Padding (1) or not (0).
optimization required Whether to extract IC Optimization (1) or not (0).

Download PDF Analysis

Returns the completed analysis in PDF format. It will include multiple tabs, based on the options selected. The typical usage is to display this on mobile devices, or where further Excel processing is not required.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/analysis/download/pdf?id=1755002352774017576&analysis=1&summary=0&padding=1&optimization=1" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/analysis/download/pdf"
);

let params = {
    "id": "1755002352774017576",
    "analysis": "1",
    "summary": "0",
    "padding": "1",
    "optimization": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/analysis/download/pdf',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
        'query' => [
            'id'=> '1755002352774017576',
            'analysis'=> '1',
            'summary'=> '0',
            'padding'=> '1',
            'optimization'=> '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/analysis/download/pdf'
params = {
  'id': '1755002352774017576',
  'analysis': '1',
  'summary': '0',
  'padding': '1',
  'optimization': '1',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (404):

{
    "errors": [
        "Statement not found"
    ]
}

Example response (500):

{
    "errors": [
        "Internal Server Error -- We had a problem with our server. Try again later."
    ]
}

Example response (401):

{
    "error": "Invalid API Key.",
    "code": 401
}

HTTP Request

GET api/v1/analysis/download/pdf

Query Parameters

Parameter Status Description
id optional integer required Statement id previously obtained.
analysis required Whether to return full analysis (1) or not (0).
summary required Whether to return summary analysis (1) or not (0).
padding required Whether to extract IC Padding (1) or not (0).
optimization required Whether to extract IC Optimization (1) or not (0).

03 - Comparison

This section handles comparing two statements.

The typical usage is to compare the old and new statement of a merchant after they were switched over to a new processor. It highlights individual line items where fees either decreased (shown in green) or increased (shown in red). As part of the comparison, transaction volumes are first normalized to the old or new transaction volumes.

Compare PDF Statements

Returns an Excel .xlsx document with the differences in the current fees of two PDF statements, normalized according to the selected transaction volumes. The statements are first both individually analyzed to produce corresponding Excel analysis.

Example request:

curl -X POST \
    "https://developer.feenavigator.com/api/v1/compare-pdf" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}" \
    -d '{"pdf1":"my_pdf_statement_1.pdf","pdf2":"my_pdf_statement_2.pdf","normalizeNew":1}'
const url = new URL(
    "https://developer.feenavigator.com/api/v1/compare-pdf"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

let body = {
    "pdf1": "my_pdf_statement_1.pdf",
    "pdf2": "my_pdf_statement_2.pdf",
    "normalizeNew": 1
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://developer.feenavigator.com/api/v1/compare-pdf',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],

        'multipart' => [
            [
                'name' => 'pdf1',
                'contents' => file_get_contents('my_pdf_statement_1.pdf'),
            ],
            [
                'name' => 'pdf2',
                'contents' => file_get_contents('my_pdf_statement_2.pdf'),
            ],
            [
                'name' => 'normalizeNew',
                'contents' => '1',
            ],
        ]
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/compare-pdf'
payload = {
    "pdf1": "my_pdf_statement_1.pdf",
    "pdf2": "my_pdf_statement_2.pdf",
    "normalizeNew": 1
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()

HTTP Request

POST api/v1/compare-pdf

Body Parameters

Parameter Type Status Description
pdf1 file required First statement PDF file.
pdf2 file required Second statement PDF file.
normalizeNew integer required If normalization is done according to new/second
statement's volumes (1) or old/first's volumes (0)

Compare Excel Analyses

Returns an Excel .xlsx document with the differences in the current fees of two Excel analyses, normalized according to the selected transaction volumes.

Example request:

curl -X POST \
    "https://developer.feenavigator.com/api/v1/compare-excel" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}" \
    -d '{"excel1":"my_analysis_1.xls","excel2":"my_analysis_2.xls","normalizeNew":1}'
const url = new URL(
    "https://developer.feenavigator.com/api/v1/compare-excel"
);

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

let body = {
    "excel1": "my_analysis_1.xls",
    "excel2": "my_analysis_2.xls",
    "normalizeNew": 1
}

fetch(url, {
    method: "POST",
    headers: headers,
    body: body
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://developer.feenavigator.com/api/v1/compare-excel',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],

        'multipart' => [
            [
                'name' => 'excel1',
                'contents' => file_get_contents('my_analysis_1.xls'),
            ],
            [
                'name' => 'excel2',
                'contents' => file_get_contents('my_analysis_2.xls'),
            ],
            [
                'name' => 'normalizeNew',
                'contents' => '1',
            ],
        ]
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/compare-excel'
payload = {
    "excel1": "my_analysis_1.xls",
    "excel2": "my_analysis_2.xls",
    "normalizeNew": 1
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()

HTTP Request

POST api/v1/compare-excel

Body Parameters

Parameter Type Status Description
excel1 file required Fist Excel analysis file.
excel2 file required Second Excel analysis file.
normalizeNew integer required If normalization is done according to new/second
statement's volumes (1) or old/first's volumes (0)

04 - History

This section handles account activity for the user.

Submitted Statements

Returns the count and names of PDF statements submitted during a time specific interval.

Example request:

curl -X GET \
    -G "https://developer.feenavigator.com/api/v1/get-statement-history?startDate=2020-06-01&endDate=2020-12-01" \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -H "Authorization: {apiKey}"
const url = new URL(
    "https://developer.feenavigator.com/api/v1/get-statement-history"
);

let params = {
    "startDate": "2020-06-01",
    "endDate": "2020-12-01",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

let headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "{apiKey}",
};

fetch(url, {
    method: "GET",
    headers: headers,
})
    .then(response => response.json())
    .then(json => console.log(json));

$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://developer.feenavigator.com/api/v1/get-statement-history',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => '{apiKey}',
        ],
        'query' => [
            'startDate'=> '2020-06-01',
            'endDate'=> '2020-12-01',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://developer.feenavigator.com/api/v1/get-statement-history'
params = {
  'startDate': '2020-06-01',
  'endDate': '2020-12-01',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': '{apiKey}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

{
    "count": 2,
    "history": [
        {
            "timestamp": "2020-06-19 12:56:32",
            "statementId": 1753313502913753640,
            "fileName": "Demo Statement 1.pdf"
        },
        {
            "timestamp": "2020-06-19 13:55:11",
            "statementId": 1753032027937042984,
            "fileName": "Demo Statement 2.pdf"
        }
    ]
}

Example response (400):

{
    "error": [
        "Please provide a valid startDate.",
        "Please provide a valid endDate."
    ],
    "code": 400
}

HTTP Request

GET api/v1/get-statement-history

Query Parameters

Parameter Status Description
startDate required Beginning of the date/time interval.
endDate required End of the date/time interval.

Errors

The FNAPI uses the following error codes:

Error Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your API key is wrong.
403 Forbidden -- The resource requested requires an elevated set of credentials.
404 Not Found -- The specified resource could not be found
405 Method Not Allowed -- You tried to access a resource with an invalid method.
406 Not Acceptable -- You requested a format that isn't json.
410 Gone -- The requested resource has been removed from our servers.
422 Unprocessable Entity -- The request contains invalid parameters.
429 Too Many Requests -- You're requesting too many resources! Slow down!
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.