API Documentation
Programmatic access to FD-258 to EFT conversion for Business tier subscribers.
Contents
Authentication
All API requests require a valid API key. Include your key in the Authorization header:
Authorization: Bearer slap_sk_your_secret_key_here
You can manage your API keys in your account dashboard. Each account can have up to 5 active API keys.
# Example using curl curl -X POST https://slapeft.com/api/v1/convert \ -H "Authorization: Bearer slap_sk_abc123..." \ -F "file=@fd258_scan.jpg" \ -F 'demographics={"last_name":"DOE",...}'
Rate Limits
Business Tier Limits
- 1,000 requests per day (resets at midnight UTC)
- Rate limit headers included in all responses
- 429 status returned when limit exceeded
Rate limit information is returned in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests allowed per day |
X-RateLimit-Remaining |
Requests remaining in current period |
X-RateLimit-Reset |
UTC timestamp when limit resets |
Endpoints
Base URL: https://slapeft.com/api/v1
Create a new EFT conversion from an FD-258 fingerprint card image.
Request
Content-Type: multipart/form-data
| Field | Type | Description |
|---|---|---|
file required |
File | FD-258 card image (JPEG, PNG, TIFF) |
demographics required |
JSON | Subject demographics (see below) |
Demographics JSON
| Field | Type | Description |
|---|---|---|
last_name required |
string | Last name (max 40 chars) |
first_name required |
string | First name (max 40 chars) |
middle_name optional |
string | Middle name |
suffix optional |
string | Name suffix (Jr, Sr, III) |
dob required |
string | Date of birth (YYYY-MM-DD) |
sex required |
string | M or F |
race required |
string | W, B, A, I, or U |
eyes required |
string | BLK, BLU, BRO, GRY, GRN, HAZ |
hair required |
string | BLK, BLN, BRO, GRY, RED, WHI, BAL |
height required |
string | Height in feet-inches (e.g., "510" for 5'10") |
weight required |
string | Weight in pounds (max 3 digits) |
pob required |
string | Place of birth (2-letter state/country) |
citizenship optional |
string | Citizenship country code (default: US) |
address required |
string | Street address |
city required |
string | City |
state required |
string | State (2-letter code) |
zip_code required |
string | ZIP code |
trust_name optional |
string | NFA Trust name |
mode optional |
string | "slaps" (default) or "rolled" |
amputated optional |
object | Map of finger position to status (XX=amputated, UP=bandaged) |
Response
{
"conversion_id": "conv_a1b2c3d4e5f6",
"status": "pending",
"message": "Conversion queued. Check status at /api/v1/convert/{conversion_id}/status",
"created_at": "2026-01-22T12:00:00Z"
}
Example
curl -X POST https://slapeft.com/api/v1/convert \ -H "Authorization: Bearer slap_sk_abc123..." \ -F "file=@fd258_scan.jpg" \ -F 'demographics={ "last_name": "DOE", "first_name": "JOHN", "dob": "1985-06-15", "sex": "M", "race": "W", "eyes": "BRO", "hair": "BRO", "height": "510", "weight": "180", "pob": "TX", "address": "123 Main St", "city": "Austin", "state": "TX", "zip_code": "78701" }'
Check the status of a conversion.
Response
{
"conversion_id": "conv_a1b2c3d4e5f6",
"status": "completed",
"progress": 100,
"message": "Conversion complete",
"download_url": "/api/v1/convert/conv_a1b2c3d4e5f6/download",
"expires_at": "2026-01-23T12:00:00Z"
}
Status Values
| Status | Description |
|---|---|
pending |
Queued for processing |
processing |
Currently being processed |
completed |
Ready for download |
failed |
Processing failed (see message) |
Download the completed EFT file. Only available after status is "completed".
Response
Files expire 24 hours after creation.
Example
curl -X GET https://slapeft.com/api/v1/convert/conv_a1b2c3d4e5f6/download \ -H "Authorization: Bearer slap_sk_abc123..." \ -o "DOE_J_20260122.eft"
Get your API usage statistics. Does not count toward rate limit.
Response
{
"key_id": "slap_abc123",
"key_name": "Production Key",
"total_requests": 1547,
"daily_limit": 1000,
"daily_usage": [
{"date": "2026-01-15", "requests": 234},
{"date": "2026-01-16", "requests": 456},
...
]
}
Error Handling
All errors return a JSON response with error and code fields:
{
"error": "Invalid API key",
"code": "invalid_key"
}
Error Codes
| HTTP Status | Code | Description |
|---|---|---|
| 400 | invalid_json |
Demographics JSON is malformed |
| 400 | missing_file |
No file uploaded |
| 400 | invalid_file_type |
File is not an image |
| 400 | not_ready |
Conversion not complete (for download) |
| 401 | missing_auth |
No Authorization header |
| 401 | invalid_auth |
Invalid authorization format |
| 401 | invalid_key |
API key is invalid or revoked |
| 404 | not_found |
Conversion not found |
| 410 | expired |
File has expired |
| 429 | rate_limited |
Daily rate limit exceeded |
| 500 | missing_output |
Internal error - EFT file missing |
Client Libraries
Coming soon. In the meantime, the API can be accessed with any HTTP client.
Python Example
import requests import json API_KEY = "slap_sk_your_key_here" BASE_URL = "https://slapeft.com/api/v1" def convert_fd258(image_path, demographics): headers = {"Authorization": f"Bearer {API_KEY}"} with open(image_path, "rb") as f: files = {"file": f} data = {"demographics": json.dumps(demographics)} resp = requests.post(f"{BASE_URL}/convert", headers=headers, files=files, data=data) return resp.json() # Usage result = convert_fd258("fd258_scan.jpg", { "last_name": "DOE", "first_name": "JOHN", # ... other fields }) print(result["conversion_id"])