Skip to main content

Base URL

All API requests should be made to:
https://api.finscreener.in

Authentication

The Finscreener Developer API uses API key authentication. You must first generate an API key from your Finscreener dashboard.

Login with API Key

POST /api/auth/login
Content-Type: application/json

{
  "api_key": "fsk_your_api_key"
}
Email/password login is not supported for the Developer API. You must use an API key (format: fsk_xxx).
Response:
{
  "token": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "bearer"
  }
}
Use the access_token in subsequent requests:
Authorization: Bearer <access_token>

Token Refresh

Access tokens expire after a set period. Use the refresh token to get a new access token:
POST /api/auth/refresh-token
Content-Type: application/json

{
  "refresh_token": "your_refresh_token"
}

Response Format

All responses are JSON formatted:

Success Response

{
  "data": { ... },
  "message": "Success"
}

Error Response

{
  "detail": "Error message describing what went wrong"
}

HTTP Status Codes

CodeDescription
200Success
201Created
400Bad Request - Invalid parameters
401Unauthorized - Invalid or expired token
403Forbidden - Insufficient permissions
404Not Found - Resource doesn’t exist
422Validation Error - Invalid input data
429Rate Limited - Too many requests
500Server Error

Rate Limits

API rate limits vary by endpoint and subscription tier:
Endpoint TypeFree TierPremium
Search100/dayUnlimited
Details100/day1000/day
Screener10/day100/day

Rate Limit Headers

Detail endpoint responses include rate limit headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 2026-03-25T23:59:59Z
HeaderDescription
X-RateLimit-LimitMaximum requests allowed per day
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetWhen the rate limit resets (UTC)

Security Headers

All API responses include Strict-Transport-Security and X-Content-Type-Options: nosniff. Responses also include Cache-Control: no-store, private to prevent sensitive data from being cached by proxies.
For detailed security information, see our Security & Data Protection page.

API Sections

Authentication

Login, token refresh, and validation

User

User profile and subscription information

Screener

Execute and manage FQL queries

Filters

Filter companies, directors, and GST records

Details

Get detailed company, director, and GST information

Watchlist

Create and manage watchlists

Orders

Create and manage data orders

Recently Registered

Access newly registered companies, directors, and GST

Reference

NIC, HSN, and SAC code lookups

CRM

CRM integration endpoints for Zoho

SDKs and Tools

Python

import requests

class FinscreenerClient:
    def __init__(self, api_key):
        self.base_url = "https://api.finscreener.in"
        self.api_key = api_key
        self.token = None

    def login(self):
        response = requests.post(
            f"{self.base_url}/api/auth/login",
            json={"api_key": self.api_key}
        )
        self.token = response.json()["token"]["access_token"]
        return self.token

    def _headers(self):
        return {"Authorization": f"Bearer {self.token}"}

    def search(self, query, entity_type="company", page=1, limit=10):
        return requests.post(
            f"{self.base_url}/api/screener/search",
            json={"query": query, "type": entity_type, "page": page, "limit": limit},
            headers=self._headers()
        ).json()

    def filter_companies(self, **filters):
        return requests.get(
            f"{self.base_url}/api/company/company-filter",
            params=filters,
            headers=self._headers()
        ).json()

    def get_company_details(self, cin):
        return requests.get(
            f"{self.base_url}/api/company/details",
            params={"cin": cin},
            headers=self._headers()
        ).json()

# Usage
client = FinscreenerClient("fsk_your_api_key")
client.login()
results = client.filter_companies(company="Reliance", state="Maharashtra")

JavaScript

const axios = require('axios');

class FinscreenerClient {
  constructor(apiKey) {
    this.baseUrl = 'https://api.finscreener.in';
    this.apiKey = apiKey;
    this.token = null;
  }

  async login() {
    const response = await axios.post(`${this.baseUrl}/api/auth/login`, {
      api_key: this.apiKey
    });
    this.token = response.data.token.access_token;
    return this.token;
  }

  get headers() {
    return { Authorization: `Bearer ${this.token}` };
  }

  async search(query, type = 'company', page = 1, limit = 10) {
    const response = await axios.post(
      `${this.baseUrl}/api/screener/search`,
      { query, type, page, limit },
      { headers: this.headers }
    );
    return response.data;
  }

  async filterCompanies(filters) {
    const response = await axios.get(
      `${this.baseUrl}/api/company/company-filter`,
      { params: filters, headers: this.headers }
    );
    return response.data;
  }

  async getCompanyDetails(cin) {
    const response = await axios.get(
      `${this.baseUrl}/api/company/details`,
      { params: { cin }, headers: this.headers }
    );
    return response.data;
  }
}

// Usage
const client = new FinscreenerClient('fsk_your_api_key');
await client.login();
const results = await client.filterCompanies({ company: 'Reliance', state: 'Maharashtra' });

cURL

# Login with API key
TOKEN=$(curl -s -X POST https://api.finscreener.in/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"api_key": "fsk_your_api_key"}' | jq -r '.token.access_token')

# Filter companies
curl -X GET "https://api.finscreener.in/api/company/company-filter?company=Reliance&state=Maharashtra" \
  -H "Authorization: Bearer $TOKEN"

# Get company details
curl -X GET "https://api.finscreener.in/api/company/details?cin=L17110MH1973PLC019786" \
  -H "Authorization: Bearer $TOKEN"