Documentation
Login / Sign Up

Get Started with the SEC API

This API provides programmatic access to SEC filing data, including insider transactions, periodic reports, ownership disclosures, and other submissions filed by reporting companies.

Use the links in this section for authentication, rate limits, and error handling — plus guides for each supported form type (Form 4, 8-K, 10-K, and others).

Authentication

Sign in to manage your API keys

Create an account or log in to create and manage API keys

Log in or Sign up

All API requests must include an API key. In production, the supported and preferred approach is the
x-api-key HTTP header on every request.

Request header (preferred in production)

curl
curl -H "x-api-key: YOUR_API_KEY" https://api.secapi.dev/api/v1/sec/submissions

For local development and quick experiments, you can also pass the same value as the apiKey query parameter when the header is missing or you need a quick URL-only test. Do not rely on query parameters in production: URLs are often logged, cached, or shared. The API evaluates the x-api-key header before considering apiKey in the query string.

Query parameter (development only)

Example URL
https://api.secapi.dev/api/v1/sec/submissions?apiKey=YOUR_API_KEY

Security notice

Keep your API keys secure. Never share your API keys in client-side code or public repositories. Avoid apiKey in URLs outside local development—request logs and referrers can expose them.

Rate Limiting

Tier Limits

TierRequests/MinuteRequests/HourRequests/DayMonthly Cost
Free103050$0
Lite5005,00050,000$29
Pro5,00050,000500,000$49
Enterprise20,000200,0002,000,000$490

Rate Limit Headers

All API responses include the following headers to help you track your rate limit status:

HeaderDescriptionExample
X-RateLimit-LimitMaximum number of requests allowed in the current period100
X-RateLimit-RemainingNumber of requests remaining in the current period99
X-RateLimit-ResetUnix timestamp when the rate limit resets1609459200
X-RateLimit-UsedNumber of requests made in the current period1

Rate Limit Exceeded Response

When you exceed your rate limit, the API will respond with a 429 Too Many Requests status code and the following response:

JSON
{  "error": {    "code": "rate_limit_exceeded",    "message": "API rate limit exceeded",    "details": {      "reset_at": "2023-01-01T00:00:00Z",      "limit": 100,      "remaining": 0,      "retry_after": 45    }  }}

Best Practices for Rate Limits

  • Implement proper error handling for 429 responses
  • Use the X-RateLimit-Remaining header to track your usage
  • Implement exponential backoff when retrying after rate limit errors
  • Cache API responses when possible to reduce the number of requests
  • Distribute requests evenly instead of sending them in bursts
  • Consider upgrading your plan if you consistently hit rate limits

Error Handling

Error Response Format

All API errors return a standardized JSON response with the following structure:

JSON
{  "error": {    "code": "string",       // Machine-readable error code    "message": "string",    // Human-readable error description    "details": { },         // Additional context-specific error details    "request_id": "string"  // Unique identifier for the request (for support)  }}

HTTP Status Codes

StatusCodeDescriptionExample
400bad_requestThe request was malformed or contains invalid parametersMissing required field
401unauthorizedAuthentication is required or credentials are invalidInvalid API key
403forbiddenClient does not have permission to access the resourceSubscription expired
404not_foundThe requested resource could not be foundEntity doesn't exist
422validation_failedThe request was valid but the server couldn't process itInvalid date format
429rate_limit_exceededThe client has sent too many requestsToo many requests
500server_errorSomething went wrong on the serverInternal exception
503service_unavailableThe service is temporarily unavailableMaintenance mode

Error Examples

400 Bad Request

JSON
{  "error": {    "code": "bad_request",    "message": "Missing required field: ticker",    "details": {      "field": "ticker",      "reason": "required"    },    "request_id": "req_7h4k2j3h4k2j3h4k2j3h"  }}

401 Unauthorized

JSON
{  "error": {    "code": "unauthorized",    "message": "Invalid API key provided",    "details": {      "reason": "invalid_key"    },    "request_id": "req_9s8d7f6g5h4j3k2l1"  }}

429 Rate Limit Exceeded

JSON
{  "error": {    "code": "rate_limit_exceeded",    "message": "Monthly API request limit exceeded for your subscription tier",    "details": {        "monthly_limit": 10,        "subscription_plan": "FREE",        "reason": "rate_limit_exceeded",        "current_usage": 10,        "reset_date": "Next month"    },    "request_id": "req_1a2b3c4d5e6f7g8h9i"  }}

Best Practices

PracticeCategoryBenefit
Use HTTPS OnlySecurityEncrypt data in transit for all API requests
Secure API KeysSecurityNever expose keys in client-side code; use environment variables server-side
Implement AuthorizationSecurityApply access controls so users only see authorized data
Validate All InputsSecuritySanitize and validate inputs to prevent injection and unexpected behavior
Implement CachingPerformanceCache responses locally to reduce network requests and improve responsiveness
Use CompressionPerformanceEnable gzip/brotli for requests and responses to reduce data transfer
Optimize Payload SizePerformanceRequest only needed data using params like fields when available
Batch RequestsPerformanceCombine related requests into single API calls when possible
Implement Retry LogicReliabilityUse exponential backoff for retries to handle temporary failures
Monitor Rate LimitsReliabilityTrack usage and implement client-side rate limiting to avoid disruptions
Handle Errors ProperlyReliabilityImplement comprehensive error handling for clear user feedback and stability
Version Your IntegrationsDevelopmentSpecify API versions in requests to ensure stability as the API evolves
Test in SandboxDevelopmentTest integrations thoroughly in sandbox before production
Maintain Backward CompatibilityDevelopmentDesign for resilience to API changes and new response fields