Technical reference
API documentation
Description
Authentication
Send the API key in the Authorization header and a unique Idempotency-Key for every write request. Keys are for server-side use only.
Authorization: Bearer <YOUR_API_KEY>
Idempotency-Key: <CLIENT_GENERATED_UUID>
Content-Type: application/jsonDo not send a user UUID. Each API key is already bound to its owner, and every request is authorized as that user. Idempotency-Key is a client-generated UUID that identifies one write attempt, not a user.
AI integration brief
Copy this concise brief into an AI assistant to help it understand the API and generate an integration plan or request example.
Endpoints
Read the current active preset category dictionary. Use the returned slug values in the categories field when creating a tool; custom category text is rejected.
Call this first when building a tool submission. Pass one to five returned slug values in POST /api/v1/tools.categories; do not send category names or custom text.
- Required scope
- Public
- Credit cost
- No charge
- Idempotency-Key
- Not required
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| locale | string | No | Optional language code such as en. Defaults to en. |
cURL example
curl 'https://navs.site/api/v1/categories?locale=en'Success response
{
"code": 200,
"msg": "Categories retrieved successfully.",
"data": {
"locale": "en",
"categories": [
{
"slug": "ai-design-tools",
"name": "AI Design Tools"
}
]
},
"timestamp": 1723526400000
}Response fields
| Field | Type | Nullable | Description |
|---|---|---|---|
| data.locale | string | No | Language code used for the returned dictionary. |
| data.categories | array of objects | No | Active category entries with slug and name. |
Upload one image before creating a tool submission. The API stores an optimized main image and thumbnail, then returns a mediaUploadId and the earliest cleanup time if the image is never attached.
Flow: call this endpoint before POST /api/v1/tools. The returned mediaUploadId belongs to the authenticated user. After first attachment, it becomes permanently reusable by the same authenticated user; an unattached upload may be cleaned after expiresAt.
- Required scope
- tools:write
- Credit cost
- No charge
- Idempotency-Key
- Not required
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| image | file | Yes | Multipart form field. JPEG, PNG, WebP, or GIF; original file up to 5 MB; 10 uploads per user per minute. |
cURL example
curl -X POST https://navs.site/api/v1/media/images \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-F "image=@./preview.png"Success response
{
"code": 201,
"msg": "Image uploaded successfully.",
"data": {
"mediaUploadId": "media_xxx",
"expiresAt": "2026-08-19T05:00:00.000Z"
},
"timestamp": 1723526400000
}Response fields
| Field | Type | Nullable | Description |
|---|---|---|---|
| data.mediaUploadId | string | No | User-owned media identifier to pass to POST /api/v1/tools. It remains reusable by the same authenticated user after first attachment. |
| data.expiresAt | ISO 8601 timestamp | No | Earliest cleanup time for an image that has not been attached. While the resource still exists it may be attached; after first attachment it remains reusable by the same authenticated user. |
Create a tool submission with validated metadata. It is queued for editorial review unless automatic publication is enabled for the account.
Flow: first call GET /api/v1/categories to choose valid slugs, then POST /api/v1/media/images to obtain mediaUploadId, then submit that ID here. After its first attachment, the same mediaUploadId can be reused by the same authenticated user.
- Required scope
- tools:write
- Credit cost
- 1 credit
- Idempotency-Key
- Required
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | 2–160 characters. |
| url | string (URL) | Yes | Public HTTP or HTTPS URL. |
| mediaUploadId | string | Yes | Returned by POST /api/v1/media/images and bound to the authenticated user. An unattached upload may be cleaned after expiresAt; after first attachment, it is permanently reusable by the same authenticated user. |
| description | string | Yes | 20–1,000 characters. |
| detail | string | Yes | 40–20,000 characters. |
| categories | string[] | Yes | 1–5 active preset category slugs for the current directory language. |
| tags | string | No | Up to 500 characters. |
| logo | string (URL) | No | Public logo URL. |
| videoUrl | string (URL) | No | Public video URL. |
| pricePlans | enum | No | Free, Freemium, or Paid. Defaults to Free. |
| supportEmail | string (email) | No | Valid support email address. |
| faqUrl | string (URL) | No | Public FAQ URL. |
| reason | string | No | Up to 2,000 characters. |
cURL example
curl -X POST https://navs.site/api/v1/tools \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Idempotency-Key: <CLIENT_GENERATED_UUID>" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Studio",
"url": "https://example.com",
"mediaUploadId": "<MEDIA_UPLOAD_ID>",
"description": "A practical AI workspace for product teams and creative collaboration.",
"detail": "Example Studio helps product teams create, revise, and share visual work with an AI-assisted workflow.",
"categories": [
"ai-design-tools"
],
"tags": "design, collaboration",
"logo": "https://example.com/logo.png",
"videoUrl": "https://www.youtube.com/watch?v=example",
"pricePlans": "Freemium",
"supportEmail": "[email protected]",
"faqUrl": "https://example.com/faq",
"reason": "A useful tool for directory visitors."
}'Success response
{
"code": 201,
"msg": "Tool submitted successfully.",
"data": {
"id": "example-com",
"status": "pending"
},
"timestamp": 1723526400000
}Response fields
| Field | Type | Nullable | Description |
|---|---|---|---|
| data.id | string | No | Directory record slug created for the submission. |
| data.status | enum | No | Submission state, usually pending or approved depending on the account publication mode. |
Response format
Every response uses code (the HTTP status), msg (a human-readable summary), data (business data or null), and timestamp (Unix milliseconds). Failed responses also include errorCode for programmatic handling. The exact data fields are listed under each endpoint.
{
"code": 201,
"msg": "Tool submitted successfully.",
"data": {
"id": "example-com",
"status": "pending"
},
"timestamp": 1723526400000
}Failure response
{
"code": 422,
"msg": "The request failed validation.",
"data": null,
"timestamp": 1723526400000,
"errorCode": "VALIDATION_ERROR"
}Idempotency and retries
Repeating the same key with the same validated request returns the original result without creating another submission or using credits again. A different request with the same key returns a replay-mismatch error.
REST conventions
The API uses HTTPS, resource-oriented paths, HTTP methods, and matching HTTP status codes. Requests and responses use JSON except POST /api/v1/media/images, which accepts multipart/form-data.
Common errors
- 401 UNAUTHORIZED
- The API key is missing, invalid, revoked, or unavailable.
- 403 API_ACCESS_REQUIRED
- The current membership does not include API access.
- 429 RATE_LIMITED
- The key has reached its request limit. Retry after the response delay.
- 402 INSUFFICIENT_CREDITS
- Neither the current membership credits nor purchased credits can cover the operation.
- 422 VALIDATION_ERROR
- The request did not pass validation; no credits are used.
- 409 IDEMPOTENCY_KEY_REPLAY_MISMATCH
- The idempotency key was previously used with a different validated request.
Editorial policy
A successful API request does not promise inclusion, a particular external-link attribute, traffic, or search performance. Content remains subject to editorial review and may be rejected or removed.
Read the Terms of Service