curl --request GET \
--url https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"job_id": "0b9e4c71-58d2-4f3a-b6e0-7a1d93c2e845",
"account_id": "6f1c2a9e-3b7d-4e21-9a55-0c8d2f4b7e10",
"status": "completed",
"items_synced": 3,
"created_at": "2026-11-05T09:01:40Z",
"finished_at": "2026-11-05T09:01:52Z"
}{
"error": {
"type": "authentication_error",
"code": "api_key_expired",
"message": "This API key expired on 3 Feb 2027. Create a new one under Settings → API keys.",
"doc_url": "https://docs.indm.social/errors#api_key_expired"
}
}{
"error": {
"type": "not_found",
"code": "media_not_found",
"message": "There's no post with that id in this workspace. GET /v1/media lists them; refresh the account first if it was just published.",
"param": "media_id",
"doc_url": "https://docs.indm.social/errors#media_not_found"
}
}{
"error": {
"type": "rate_limited",
"code": "rate_limited",
"message": "That's more than 120 requests a minute on one key. Wait 18s and try again.",
"doc_url": "https://docs.indm.social/errors#rate_limited"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Something went wrong on our end. Try again; if it keeps happening, quote request req_8Qm2ZcY4vN7tLp1K to support@indm.social.",
"doc_url": "https://docs.indm.social/errors#internal_error"
}
}Get a refresh
Where a refresh has got to. Poll every few seconds until status is completed,
then read List media. A first sync of a large
account takes a few minutes.
Needs a read or full key.
curl --request GET \
--url https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.indm.social/v1/accounts/{account_id}/refresh/{job_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"job_id": "0b9e4c71-58d2-4f3a-b6e0-7a1d93c2e845",
"account_id": "6f1c2a9e-3b7d-4e21-9a55-0c8d2f4b7e10",
"status": "completed",
"items_synced": 3,
"created_at": "2026-11-05T09:01:40Z",
"finished_at": "2026-11-05T09:01:52Z"
}{
"error": {
"type": "authentication_error",
"code": "api_key_expired",
"message": "This API key expired on 3 Feb 2027. Create a new one under Settings → API keys.",
"doc_url": "https://docs.indm.social/errors#api_key_expired"
}
}{
"error": {
"type": "not_found",
"code": "media_not_found",
"message": "There's no post with that id in this workspace. GET /v1/media lists them; refresh the account first if it was just published.",
"param": "media_id",
"doc_url": "https://docs.indm.social/errors#media_not_found"
}
}{
"error": {
"type": "rate_limited",
"code": "rate_limited",
"message": "That's more than 120 requests a minute on one key. Wait 18s and try again.",
"doc_url": "https://docs.indm.social/errors#rate_limited"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Something went wrong on our end. Try again; if it keeps happening, quote request req_8Qm2ZcY4vN7tLp1K to support@indm.social.",
"doc_url": "https://docs.indm.social/errors#internal_error"
}
}Authorizations
An API key from Settings → API keys in the inDM app, sent as
Authorization: Bearer indm_.... Keys belong to one workspace and carry a scope:
read for GET routes and the validate dry run, full for everything. Keep keys on
your server; never ship one to a browser or a mobile app.
Response
The refresh job.
pending and running: keep polling. completed: read the media.
failed: Instagram didn't return the posts this time; try once more, and check
account health if it fails again.
pending, running, completed, failed, canceled How many posts this refresh brought in so far.
When the refresh was queued.
When it finished. Present once it has.