Grounded in the service's own OpenAPI 3.1 definition
API reference
Every parameter constraint, enum value and response field below is taken from the indexer's published interface definition. Paths are relative to the base URL of whichever Drops indexer you are pointed at; this page names no host, because the endpoints are the contract and the deployment is yours to choose.
Conventions
| Definition | OpenAPI 3.1, served by the indexer itself |
|---|---|
| Authentication | None. Every endpoint on this page is an unauthenticated public read. |
| Pagination | Offset based: start and limit. Defaults differ per endpoint and are stated in each table. |
| Ordering | Lists are newest first unless an endpoint says otherwise. |
| Hex casing | Responses emit lowercase hex, except dropmark, which is uppercase by definition. |
| Rate limits | No rate-limit headers and no 429 response are declared for any Drops or Pacts read endpoint. |
The service also exposes authenticated operator endpoints for scanning, replay, reconciliation and metrics. They are not part of the protocol, are not public, and are deliberately not documented here.
Artifacts
GET /drops/inscriptions
List confirmed Drops artifacts.
| Name | Type | Constraint | Default |
|---|---|---|---|
mime | string | Maximum 80 characters | none |
address | string | Matches current or initial owner | none |
txid | string | ^[0-9a-fA-F]{64}$ | none |
marker | enum | drops or drops-pact. bip110-op-drop is deliberately excluded. | none |
planHash | string | ^[0-9a-f]{64}$, matches a Pacts reference plan hash | none |
start | integer | 0 to 10000000 | 0 |
limit | integer | 1 to 100 | 20 |
Returns an object with total (integer, zero or more) and inscriptions (array of DropsInscription).
GET /drops/inscriptions/{dropId}
Fetch one artifact with its proof material. The path segment accepts several forms and the response always emits the full portable identity.
| Form | Example |
|---|---|
| Full portable identity | drops:mainnet:6b1f…91aa:d0 |
| Shorthand | 6b1f…91aa:d0 |
| Historical alias | i0 style input alias |
| Display sequence | The deployment-local sequence number |
Responses: 200 with a DropsInscription, or 404 with an Error.
The shorthand, alias and sequence forms are conveniences for one deployment. Store and exchange the full drops:<network>:<txid>:d<input> form.
GET /drops/inscriptions/{dropId}/body
The exact immutable body bytes, at most 256 of them. The response applies the passive-content serving policy: text/plain and the raster image types keep their declared media type and render inline; SVG, HTML, JavaScript, XML, JSON, PDF and any unknown type are served as an application/octet-stream attachment.
| Header | Value |
|---|---|
ETag | The body SHA-256, quoted |
Cache-Control | Long-lived and immutable; the bytes at a Drop identity can never change |
Content-Disposition | inline or attachment, per the serving policy |
Content-Security-Policy | default-src 'none'; sandbox |
X-Content-Type-Options | nosniff |
GET /drops/inscriptions/{dropId}/transfers
List confirmed drops-custody-v1 custody transitions for one artifact, newest first. Query parameters: start (integer 0 to 10000000, default 0) and limit (integer 1 to 100, default 20). Responses: 200, or 404 with an Error.
Pacts
Any method other than GET on a Pacts path returns 405 with the error code PACTS_REFERENCE_READ_ONLY and a copy of the capability contract. This is the API-level expression of the reference-only boundary.
GET /drops/pacts/capabilities
The machine-readable capability boundary. Read this before building anything against Pacts. Every execution, custody, authorization, signature, broadcast, live-Cell, off-chain-policy and value-bearing authority field is false.
{
"schemaVersion": 1,
"mode": "reference",
"supported": {
"verifiedDrops": true,
"recordedPactSeeds": true,
"pactsReferences": true,
"deterministicPrimitives": true,
"localProofPackValidation": true
},
"authority": {
"pactCell": false,
"liveCells": false,
"transaction": false,
"authorization": false,
"signature": false,
"signatures": false,
"broadcast": false,
"custody": false,
"contractExecution": false,
"enforceableOffChainPolicy": false,
"valueBearingPacts": false,
"valueBearingAuthority": false
},
"recovery": {
"status": "reference_only",
"message": "...",
"actions": ["..."]
}
}
Every value shown is a constant in the interface definition, not an example. An implementation that returns anything else for these fields is not the reference Pacts surface.
GET /drops/pacts
List recorded immutable Pact Seeds, newest first. One query parameter: limit (integer 1 to 100, default 50). There is no offset parameter on this endpoint. The response carries data (array of PactDropRecord), count (0 to 100), notice (the reference-only notice string), and capability (the full capability object above).
GET /drops/pacts/{pactId}
Fetch one Pact Seed record. Path parameter pactId must match ^[0-9a-f]{64}$. Responses: 200 with a PactDropRecord, or 404.
Health and status
GET /drops/health
Returns status: "ok", protocol: "drops", ready: true, plus two objects. A 503 means a dependency is unavailable, or the scanner does not hold leadership or a current finalized state.
| Field | Type | Why it matters |
|---|---|---|
data.network | string | Which network these answers are about. |
data.confirmationsRequired | integer, at least 1 | The depth at which this deployment records state. Six or more on mainnet. |
data.totalInscriptions, data.totalPacts | integer | Recorded totals. |
data.custodyIntegrity | object | Projection drift counters and a custodyHealthy boolean. |
indexer.serviceRole | api, scanner, all | Whether this process scans, serves, or both. |
indexer.state | string | Only synced means current to the finalized target. |
indexer.scanner | object | Leadership state, one of eight values. See validation. |
indexer.tipFresh, tipAgeSeconds, lagBlocks | boolean, integer or null | How far behind the chain tip this view is. |
indexer.operatorActionRequired | boolean | True when the indexer has stopped and is waiting for a decision. |
GET /drops/status
Totals and diagnostic counters, including in-memory rejection counts. The interface definition marks this payload as open and explicitly not authoritative. Use it for operations, not for protocol decisions.
Service-level endpoints
| Endpoint | Returns |
|---|---|
GET /live | Liveness only: status: "ok", protocol: "op-drop". Says nothing about readiness. |
GET /ready | Readiness, 200 or 503. |
GET /health | Combined health: database, indexer, schema identity, and per-dependency status. |
GET /version | Release provenance, including minimumMainnetConfirmations, which is at least 6. |
Schemas
DropsInscription
| Field | Type and constraint |
|---|---|
dropId required | string, drops:<network>:<txid>:d<input> |
marker | enum: drops, drops-pact |
mime | string |
bodyBytes | integer, 1 to 256 |
bodySha256 | ^[a-f0-9]{64}$ |
bodyUrl | string |
dropmark | ^[0-9A-F]{10}$, decorative |
creatorPubkey | ^[a-f0-9]{64}$ |
sequence, displayName | integer at least 0, string. Presentation only. |
initialOwnerAddress required | string or null |
currentOwnerAddress required | string or null |
custodyStatus required | enum: active, burned, legacy_unresolved |
currentCustodyOutpoint required | null, or an object with txid, vout, scriptHex, valueSats |
custody required | object; profile is the constant drops-custody-v1, plus status, currentOutpoint, scriptHex, valueSats, transferCount, lastTransferHeight, lastTransferTxid, verifiedAt, verifiedHeight, verifiedBlockHash, projectionVersion, verificationSource |
reveal required | object: txid, input, height, blockHash |
pactSeed, pactsReference | Present when the body matched a Pact body profile |
PactDropRecord
Required: id, number, marker, network, contentType, contentHash, dropmark, bodyHex, creatorPubkey, reveal, anchor, verification, finality, indexedAt.
networkis one ofmainnet,testnet,signet,regtest.numberis a presentation number, explicitly not an identity.contentHashandcreatorPubkeymatch^[0-9a-f]{64}$;bodyHexmatches^(?:[0-9a-f]{2})+$.verification.taprootCommittedis the constanttrue. A record only exists if its commitment verified.finality.statusis the constantfinalized. Note thatfinalizedAtis typed as always null in the current definition, so do not rely on it for a timestamp; usereveal.heightinstead.pactSeedandpactsReferenceappear when the body decoded as one of those profiles.
PactSeed
All of pactId, rulesetHash, abiHash, genesisStateRoot, policyRoot and dataAvailabilityPolicyHash match ^[0-9a-f]{64}$. engineId matches ^[a-z][a-z0-9-]{0,15}$. enforcementFloor is one of recorded, co-signed, template-enforced. Every field is required.
PactsReference
template matches ^[a-z][a-z0-9-]{0,40}$; planHash and blueprintHash each match ^[0-9a-f]{64}$. All three are required.
Error
{ "statusCode": 404, "error": "Not Found", "message": "..." }
The shape is open and none of the three fields is formally required, so a client should treat all three as optional and fall back to the HTTP status. The only structured error code on the Drops and Pacts surface is PACTS_REFERENCE_READ_ONLY, returned with 405.