Skip to main content

Base URL

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

Authentication

The Finscreener API uses JWT (JSON Web Token) authentication. There are two ways to authenticate:

Option 1: Email/Password Login

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

{
  "email": "[email protected]",
  "password": "your_password"
}
POST /api/auth/login
Content-Type: application/json

{
  "api_key": "fsk_your_api_key"
}
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
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 are included in API responses:
  • X-RateLimit-Limit: Maximum requests allowed
  • X-RateLimit-Remaining: Requests remaining
  • X-RateLimit-Reset: Time when limit resets

API Sections

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_company(self, query):
        return requests.get(
            f"{self.base_url}/api/screener/search/company",
            params={"name": query},
            headers=self._headers()
        ).json()

# Usage
client = FinscreenerClient("fsk_your_api_key")
client.login()
results = client.search_company("Reliance")

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 searchCompany(query) {
    const response = await axios.get(
      `${this.baseUrl}/api/screener/search/company`,
      { params: { name: query }, headers: this.headers }
    );
    return response.data;
  }
}

// Usage
const client = new FinscreenerClient('fsk_your_api_key');
await client.login();
const results = await client.searchCompany('Reliance');

cURL

# Login
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')

# Search companies
curl -X GET "https://api.finscreener.in/api/screener/search/company?name=Reliance" \
  -H "Authorization: Bearer $TOKEN"