Legacy imports API
HTTP reference for legacy imports. Read authentication and access before using these operations. All examples use made-up data and placeholder credentials.
GET /v1/farm/{farm_id}/import
Get Imports
Current legacy imports HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Pagination accepts integer skip and take; set both explicitly. An omitted value passes through to the data query. Collection property names differ by resource; use the response schema. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429.
Parameter In Required Schema farm_id path Yes {"type":"string","format":"uuid"} skip query No {"type":"integer"} take query No {"type":"integer"} status query No {"type":"string","enum":["COMPLETED","FAILED","PENDING","PROCESSING"]}
Request example
bash example Copy example
curl --fail-with-body -X GET \
'https://api.ranch.bot/v1/farm/<farm_id>/import' \
-H "Authorization: Bearer $RANCHBOT_TOKEN"
Responses
Status Meaning Content type 200 Success application/json 400 Request validation failed. application/json 401 Missing/invalid authentication or insufficient farm role. application/json 403 Missing required scope or credential type is disallowed. application/json 404 Resource or active farm membership not found. application/json 429 Rate limit exceeded. Retry after the indicated delay. application/json 500 Unexpected server failure. application/json
200 response schema (application/json)
Field Type Presence Constraints records array Required records[] object Required records[].status string Required enum: ["COMPLETED","FAILED","PENDING","PROCESSING"] records[].id string Required records[].created_at string Required format: "date-time" records[].updated_at string Required format: "date-time" records[].user_id string Required records[].farm_id string Required records[].metadata JSON Required records[].completed_at (variant 1) null Required records[].completed_at (variant 2) string Required format: "date-time" records[].file_id string Required records[].error_message (variant 1) null Required records[].error_message (variant 2) string Required records[].format string Required enum: ["CSV","JSON"] records[].file object Required records[].file.id (variant 1) string Required records[].file.id (variant 2) null Required records[].file.is_active (variant 1) boolean Required records[].file.is_active (variant 2) null Required records[].file.mime_type (variant 1) string Required records[].file.mime_type (variant 2) null Required records[].file.name (variant 1) string Required records[].file.name (variant 2) null Required records[].file.size (variant 1) integer Required records[].file.size (variant 2) null Required records[].file.url (variant 1) string Required records[].file.url (variant 2) null Required records[].file.created_at (variant 1) string Required format: "date-time" records[].file.created_at (variant 2) null Required records[].file.updated_at (variant 1) string Required format: "date-time" records[].file.updated_at (variant 2) null Required records[].user object Required records[].user.id string Required records[].user.full_name string or null Required records[].user.phone_number_local string or null Required total number Required
json example Copy example
{
"records": [
{
"status": "PENDING",
"id": "11111111-1111-4111-8111-111111111111",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z",
"user_id": "11111111-1111-4111-8111-111111111111",
"farm_id": "11111111-1111-4111-8111-111111111111",
"metadata": null,
"completed_at": null,
"file_id": "11111111-1111-4111-8111-111111111111",
"error_message": null,
"format": "CSV",
"file": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "flock.csv",
"mime_type": "text/csv",
"size": 128,
"url": "https://example.com/flock.csv",
"is_active": true,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
},
"user": {
"id": "11111111-1111-4111-8111-111111111111",
"full_name": null,
"phone_number_local": null
}
}
],
"total": 1
}
POST /v1/farm/{farm_id}/import
Create Import
Current legacy imports HTTP operation. External credential scopes: write:records. Minimum farm role: EDITOR. Direct requests execute without an app confirmation screen. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429. Known current limitation: upload middleware populates req.file while the handler expects req.files. A normal single-file upload returns 400 No file provided. This route is not a working import walkthrough; use import requests for supervised intake.
Parameter In Required Schema farm_id path Yes {"type":"string","format":"uuid"}
Request body (multipart/form-data)
Field Type Presence Constraints file string Required format: "binary"
Request example
bash example Copy example
curl --fail-with-body -X POST \
'https://api.ranch.bot/v1/farm/<farm_id>/import' \
-H "Authorization: Bearer $RANCHBOT_TOKEN" \
-F 'file=@/path/to/example.csv'
Responses
Status Meaning Content type 400 Error application/json 401 Missing/invalid authentication or insufficient farm role. application/json 403 Missing required scope or credential type is disallowed. application/json 404 Resource or active farm membership not found. application/json 429 Rate limit exceeded. Retry after the indicated delay. application/json 500 Error application/json
400 response schema (application/json)
Field Type Presence Constraints (variant 1) (variant 1) object Required (variant 1) (variant 1).errors array Required (variant 1) (variant 1).errors[] object Required (variant 1) (variant 1).errors[].message string Required (variant 1) (variant 1).data null Required (variant 1) (variant 1).success boolean Required (variant 1) (variant 2) object Required (variant 1) (variant 2).errors array Required (variant 1) (variant 2).errors[] object Required (variant 1) (variant 2).errors[].message string Required (variant 1) (variant 2).data null Required (variant 1) (variant 2).success boolean Required (variant 2) object Required (variant 2).errors array Required (variant 2).errors[] object Required (variant 2).errors[].message string Required (variant 2).data null Required (variant 2).success boolean Required
json example Copy example
{
"errors": [],
"data": null,
"success": true
}
500 response schema (application/json)
Field Type Presence Constraints errors array Required errors[] object Required errors[].message string Required data null Required success boolean Required
json example Copy example
{
"errors": [],
"data": null,
"success": true
}
GET /v1/farm/{farm_id}/import/{import_id}
Get Import
Current legacy imports HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429.
Parameter In Required Schema farm_id path Yes {"type":"string","format":"uuid"} import_id path Yes {"type":"string","format":"uuid"}
Request example
bash example Copy example
curl --fail-with-body -X GET \
'https://api.ranch.bot/v1/farm/<farm_id>/import/<import_id>' \
-H "Authorization: Bearer $RANCHBOT_TOKEN"
Responses
Status Meaning Content type 200 Success application/json 400 Request validation failed. application/json 401 Missing/invalid authentication or insufficient farm role. application/json 403 Missing required scope or credential type is disallowed. application/json 404 Resource or active farm membership not found. application/json 429 Rate limit exceeded. Retry after the indicated delay. application/json 500 Unexpected server failure. application/json
200 response schema (application/json)
Field Type Presence Constraints status string Required enum: ["COMPLETED","FAILED","PENDING","PROCESSING"] id string Required created_at string Required format: "date-time" updated_at string Required format: "date-time" user_id string Required farm_id string Required metadata JSON Required completed_at (variant 1) null Required completed_at (variant 2) string Required format: "date-time" file_id string Required error_message (variant 1) null Required error_message (variant 2) string Required format string Required enum: ["CSV","JSON"] file object Required file.id (variant 1) string Required file.id (variant 2) null Required file.is_active (variant 1) boolean Required file.is_active (variant 2) null Required file.mime_type (variant 1) string Required file.mime_type (variant 2) null Required file.name (variant 1) string Required file.name (variant 2) null Required file.size (variant 1) integer Required file.size (variant 2) null Required file.url (variant 1) string Required file.url (variant 2) null Required file.created_at (variant 1) string Required format: "date-time" file.created_at (variant 2) null Required file.updated_at (variant 1) string Required format: "date-time" file.updated_at (variant 2) null Required user object Required user.id string Required user.full_name string or null Required user.phone_number_local string or null Required import_items array Required import_items[] object Required import_items[].id string Required import_items[].action_id string or null Required import_items[].import_id string Required import_items[].entity_id string Required import_items[].entity_type string Required enum: ["ANIMAL","ANIMAL_IDENTIFIER","GROUP","RECORD","RECORD_ITEM"] import_items[].error_message string or null Required import_items[].mapped_data JSON Required import_items[].row_number integer or null Required import_items[].source_data JSON Required import_items[].status string Required enum: ["FAILED","PENDING","PROCESSED"] import_items[].created_at string Required format: "date-time" import_items[].updated_at string Required format: "date-time" import_items[].action (variant 1) object Required import_items[].action (variant 1).id string Required import_items[].action (variant 1).agent_action_id string or null Required import_items[].action (variant 1).action_type string Required import_items[].action (variant 1).entity_id string Required import_items[].action (variant 1).entity_type string Required enum: ["ANIMAL","ANIMAL_IDENTIFIER","GROUP","RECORD","RECORD_ITEM"] import_items[].action (variant 1).state_after JSON Required import_items[].action (variant 1).state_before JSON Required import_items[].action (variant 1).undone_at string or null Required format: "date-time" import_items[].action (variant 1).created_at string Required format: "date-time" import_items[].action (variant 1).updated_at string Required format: "date-time" import_items[].action (variant 2) null Required
json example Copy example
{
"status": "COMPLETED",
"id": "11111111-1111-4111-8111-111111111111",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z",
"user_id": "11111111-1111-4111-8111-111111111111",
"farm_id": "11111111-1111-4111-8111-111111111111",
"metadata": null,
"completed_at": "2026-09-01T12:00:00.000Z",
"file_id": "11111111-1111-4111-8111-111111111111",
"error_message": null,
"format": "CSV",
"file": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "flock.csv",
"mime_type": "text/csv",
"size": 128,
"url": "https://example.com/flock.csv",
"is_active": true,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
},
"user": {
"id": "11111111-1111-4111-8111-111111111111",
"full_name": null,
"phone_number_local": null
},
"import_items": [
{
"id": "55555555-5555-4555-8555-555555555555",
"action_id": "44444444-4444-4444-8444-444444444444",
"import_id": "11111111-1111-4111-8111-111111111111",
"entity_id": "22222222-2222-4222-8222-222222222222",
"entity_type": "ANIMAL",
"error_message": null,
"mapped_data": {
"metadata": {
"tag": "42"
}
},
"row_number": 1,
"source_data": {
"tag": "42"
},
"status": "PROCESSED",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z",
"action": {
"id": "44444444-4444-4444-8444-444444444444",
"agent_action_id": null,
"action_type": "CREATE",
"entity_id": "22222222-2222-4222-8222-222222222222",
"entity_type": "ANIMAL",
"state_before": null,
"state_after": {
"id": "22222222-2222-4222-8222-222222222222",
"metadata": {
"tag": "42"
}
},
"undone_at": null,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
}
}
]
}
GET /v1/farm/{farm_id}/import/{import_id}/changes
Get Import Changes
Current legacy imports HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429.
Parameter In Required Schema farm_id path Yes {"type":"string","format":"uuid"} import_id path Yes {"type":"string","format":"uuid"}
Request example
bash example Copy example
curl --fail-with-body -X GET \
'https://api.ranch.bot/v1/farm/<farm_id>/import/<import_id>/changes' \
-H "Authorization: Bearer $RANCHBOT_TOKEN"
Responses
Status Meaning Content type 200 Success application/json 400 Request validation failed. application/json 401 Missing/invalid authentication or insufficient farm role. application/json 403 Missing required scope or credential type is disallowed. application/json 404 Resource or active farm membership not found. application/json 429 Rate limit exceeded. Retry after the indicated delay. application/json 500 Unexpected server failure. application/json
200 response schema (application/json)
Field Type Presence Constraints import object Required import.status string Required enum: ["COMPLETED","FAILED","PENDING","PROCESSING"] import.id string Required import.created_at string Required format: "date-time" import.updated_at string Required format: "date-time" import.user_id string Required import.farm_id string Required import.metadata JSON Required import.completed_at (variant 1) null Required import.completed_at (variant 2) string Required format: "date-time" import.file_id string Required import.error_message (variant 1) null Required import.error_message (variant 2) string Required import.format string Required enum: ["CSV","JSON"] changes array Required changes[] JSON Required changes[] object Required changes[].id string Required changes[].action_id string or null Required changes[].import_id string Required changes[].entity_id string Required changes[].entity_type string Required enum: ["ANIMAL","ANIMAL_IDENTIFIER","GROUP","RECORD","RECORD_ITEM"] changes[].error_message string or null Required changes[].mapped_data JSON Required changes[].row_number integer or null Required changes[].source_data JSON Required changes[].status string Required enum: ["FAILED","PENDING","PROCESSED"] changes[].created_at string Required format: "date-time" changes[].updated_at string Required format: "date-time" changes[].action (variant 1) object Required changes[].action (variant 1).id string Required changes[].action (variant 1).agent_action_id string or null Required changes[].action (variant 1).action_type string Required changes[].action (variant 1).entity_id string Required changes[].action (variant 1).entity_type string Required enum: ["ANIMAL","ANIMAL_IDENTIFIER","GROUP","RECORD","RECORD_ITEM"] changes[].action (variant 1).state_after JSON Required changes[].action (variant 1).state_before JSON Required changes[].action (variant 1).undone_at string or null Required format: "date-time" changes[].action (variant 1).created_at string Required format: "date-time" changes[].action (variant 1).updated_at string Required format: "date-time" changes[].action (variant 2) null Required changes[] object Required changes[].action_id string Required changes[].action object Required changes[].action.id string Required changes[].action.agent_action_id string or null Required changes[].action.action_type string Required changes[].action.entity_id string Required changes[].action.entity_type string Required enum: ["ANIMAL","ANIMAL_IDENTIFIER","GROUP","RECORD","RECORD_ITEM"] changes[].action.state_after JSON Required changes[].action.state_before JSON Required changes[].action.undone_at string or null Required format: "date-time" changes[].action.created_at string Required format: "date-time" changes[].action.updated_at string Required format: "date-time"
json example Copy example
{
"import": {
"status": "COMPLETED",
"id": "11111111-1111-4111-8111-111111111111",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z",
"user_id": "11111111-1111-4111-8111-111111111111",
"farm_id": "11111111-1111-4111-8111-111111111111",
"metadata": null,
"completed_at": "2026-09-01T12:00:00.000Z",
"file_id": "11111111-1111-4111-8111-111111111111",
"error_message": null,
"format": "CSV"
},
"changes": [
{
"id": "55555555-5555-4555-8555-555555555555",
"action_id": "44444444-4444-4444-8444-444444444444",
"import_id": "11111111-1111-4111-8111-111111111111",
"entity_id": "22222222-2222-4222-8222-222222222222",
"entity_type": "ANIMAL",
"error_message": null,
"mapped_data": {
"metadata": {
"tag": "42"
}
},
"row_number": 1,
"source_data": {
"tag": "42"
},
"status": "PROCESSED",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z",
"action": {
"id": "44444444-4444-4444-8444-444444444444",
"agent_action_id": null,
"action_type": "CREATE",
"entity_id": "22222222-2222-4222-8222-222222222222",
"entity_type": "ANIMAL",
"state_before": null,
"state_after": {
"id": "22222222-2222-4222-8222-222222222222",
"metadata": {
"tag": "42"
}
},
"undone_at": null,
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
}
}
]
}
Error body
Validation and authentication errors generally use this envelope. Rate-limit errors omit data; OAuth polling also has protocol-specific errors shown in its reference.
json example Copy example
{
"success": false,
"errors": [
{
"code": 400,
"name": "ValidationError",
"message": "Example validation failure"
}
]
}