Skip to content
Fluxer API

Search indexes

A search index holds the documents a search reads, and a rebuild writes those documents from current data. These two routes queue a rebuild and read its progress. The rebuild itself runs as the refreshSearchIndex background task described by Jobs.

Both routes require the ACL guild:lookup.

index_name is one of the following values. A value outside the set fails path validation.

ValueScopeDescription
guildsInstance-wideEvery guild, backing Admin guild search
usersInstance-wideEvery account, backing Admin user search
reportsInstance-wideEvery report, backing Admin report search
audit_logsInstance-wideEvery Admin audit entry, backing Admin audit search
discovery1Instance-wideDiscovery metadata written onto the guild documents of approved listings
channel_messages2One guildMessages of every channel in one guild, requiring guild_id
guild_members3One guildMembers of one guild, requiring guild_id
favorite_memes4One userFavourited memes of one user, requiring user_id

1 This name has no index of its own. It reads every approved listing and writes its description, category, primary language, and tags onto the existing guild documents in batches of 200

2 This name indexes no message itself. It clears the message documents of every channel in the guild, then queues one indexChannelMessages job for each channel

3 The rebuild clears the guild’s member documents first and stamps members_indexed_at on the guild when it finishes

4 No worker handler is registered for this name. The queued job fails before it writes any progress record

Every instance-wide name other than discovery deletes its documents before the first batch is written, so search over that index is incomplete for the whole run.

A receipt for one queued rebuild.

FieldTypeDescription
successbooleanAlways true
job_id1stringThe ID of the queued rebuild, used to read its progress

1 The value is a snowflake rendered as a string. It addresses the progress record that Get search index refresh reads. It differs from the job_id of the Jobs ledger entry for the same rebuild, and appears there only inside that entry’s payload

{
"success": true,
"job_id": "1501314428688998182"
}

Progress for one queued rebuild. The object has two shapes, selected by status.

FieldTypeDescription
statusstringAlways not_found
FieldTypeDescription
statusstringOne of in_progress, completed, or failed
index_typestringThe search index name being rebuilt
total?1numberThe number of documents expected, present while the rebuild reports progress and once it completes
indexed?2numberThe number of documents written so far
started_at?3ISO8601 timestampThe time the rebuild last reported progress
completed_at?ISO8601 timestampThe time the rebuild finished, present only when status is completed
failed_at?ISO8601 timestampThe time the rebuild failed, present only when status is failed
error?stringThe failure text, present only when status is failed

1 total is the same value as indexed while the rebuild runs and becomes the real total on completion. The discovery rebuild reports the approved listing count from its first batch onwards

2 The unit is the document the handler writes. A channel_messages rebuild counts the channels it queued

3 Rewritten on every progress report, so its value moves forward while the rebuild runs

The failure write replaces the record with the status, the index type, the error text, and the failure time, so a failed record has neither total nor indexed.

{
"status": "in_progress",
"index_type": "guilds",
"total": 3000,
"indexed": 3000,
"started_at": "2026-08-31T09:12:44.118Z"
}
POST/v1/admin/search/indexes/{index_name}/refreshesAudit reason

Queues a rebuild of the named index. Requires guild:lookup. Returns a search index refresh object on success.

FieldTypeDescription
index_namestringThe search index name to rebuild

Every field is optional. Fluxer reads an absent or empty body as an empty object, so an instance-wide rebuild can send no body at all. A body that is not parseable JSON returns 400 INVALID_FORM_BODY with the validation code INVALID_FORMAT at the body path.

FieldTypeDescription
guild_id?1snowflakeThe ID of the guild whose copy of the index is rebuilt
user_id?2snowflakeThe ID of the user whose copy of the index is rebuilt

1 Required by channel_messages and guild_members. Every other index name ignores it

2 Required by favorite_memes. Every other index name ignores it

Fluxer records both values on the audit entry whenever they are supplied, including on an index name that ignores them.

StatusBodyCondition
200search index refresh objectThe rebuild was queued
400error responseINVALID_FORM_BODY because the scope ID the index name requires is missing, or the body is not parseable JSON
403error responseMISSING_PERMISSIONS without admin:authenticate, or MISSING_ACL without guild:lookup
500error responseThe job could not be queued

A missing scope ID names guild_id or user_id in errors. Fluxer queues no job and records no audit entry for that failure.

Fluxer rebuilds the named index from current data in batches of 1,000 documents. A guild-scoped rebuild does not check that the guild exists, so an unknown ID produces an empty index.

The job has an attempt budget of 1, so a rebuild that throws is not retried.

Fluxer records one Admin audit entry with the action queue_refresh_index, the target type search_index, and the target ID 0. Its metadata has index_type, job_id, and whichever of guild_id and user_id the request supplied. Fluxer emits no Gateway Dispatch.

200 requests per minute for each authenticated user, on the admin:lookup bucket.

GET/v1/admin/search/index-refreshes/{job_id}

Returns the search index refresh progress object for one queued rebuild. Requires guild:lookup.

FieldTypeDescription
job_id1stringThe identifier returned by Refresh search index

1 The value is bounded at 1 to 128 characters after normalisation and need not be a snowflake

StatusBodyCondition
2001search index refresh progress objectA progress record was returned, including the not-found shape
403error responseMISSING_PERMISSIONS without admin:authenticate, or MISSING_ACL without guild:lookup

1 An unknown identifier answers 200 with status set to not_found, which is also the answer for an expired record and for a rebuild that failed before writing its first record

200 requests per minute for each authenticated user, on the admin:lookup bucket.