{"openapi": "3.1.0", "info": {"title": "SCiMMA Rubin Crossmatch Service API", "version": "1.0.0", "description": "Read-only queries over Rubin alert objects and their catalog crossmatches. Service version 0.16.2; contract version 1.0.0. Rubin object positions (ra, dec, and searched positions) are ICRS right ascension and declination in degrees; radii and separations are in arcsec. A coincident source position is the catalog's own, in degrees, read from its coordinate columns (gaia_dr3: ra, dec; des_y6_gold: RA, DEC; delve_dr3_gold: RA, DEC; skymapper_dr4: raj2000, dej2000), in the frame and epoch the catalog publishes: the crossmatch compares positions as stored, with no proper motion applied and no epoch propagation. gaia_dr3 positions are at the reference epoch in the ref_epoch payload column (J2016.0 for Gaia DR3). skymapper_dr4 coordinate columns carry a J2000 suffix (raj2000, dej2000) and are published under those names; see the SkyMapper DR4 documentation for their epoch.\n\nFor each object and each catalog, the crossmatch keeps only the nearest catalog source within the crossmatch radius, so an object has at most one coincident source per catalog; other sources inside the radius are not reported. A coincident source is not a host association.\n\nA coincident source is a catalog source within the crossmatch radius of the object position; it is not a host association. The host galaxy of an offset supernova is generally not a coincident source, so the absence of a coincident source is not evidence of a hostless transient.\n\n\"Not in this service\" (status not_in_service, or no_rubin_object for a position) is not evidence that the object failed a reliability cut or does not exist in Rubin: reliability filtering happens before an alert is stored (at the broker, or at ingest for the cut this service enforces; see reliability_cuts), and the service holds only alerts its brokers delivered.\n\nA cursor pins the object set of a paged walk, not the objects' state: an object's status and coincident sources can advance between pages as crossmatching proceeds. as_of bounds ingest time, it is not a snapshot: ingest time is set before an ingest commits, so an object whose ingest commits during the walk can still appear on a later page if its ingest time is at or before as_of.\n\nAccess is public and unauthenticated; authentication may be required in a future release."}, "paths": {"/openapi.json": {"get": {"operationId": "get_openapi", "summary": "This OpenAPI document.", "description": "The OpenAPI 3.1 document for every operation, built per request from the live configuration, so its radius, catalogs, reliability cuts, limits, and version describe the running service. Numeric fields name their unit in x-unit. Start here, or at /llms.txt.", "responses": {"200": {"description": "The OpenAPI 3.1 document.", "content": {"application/json": {"schema": {"type": "object", "required": ["openapi", "info", "paths"]}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/objects/{diaObjectId}": {"get": {"operationId": "get_object", "summary": "Look up one Rubin object by diaObjectId.", "description": "What the service knows about one object: its status, per-catalog search outcomes, provenance, and coincident sources. The response has the lookup_objects shape with one result. \"Not in this service\" (status not_in_service, or no_rubin_object for a position) is not evidence that the object failed a reliability cut or does not exist in Rubin: reliability filtering happens before an alert is stored (at the broker, or at ingest for the cut this service enforces; see reliability_cuts), and the service holds only alerts its brokers delivered.", "parameters": [{"name": "diaObjectId", "in": "path", "required": true, "schema": {"$ref": "#/components/schemas/DiaObjectIdStr"}, "description": "The diaObjectId, as a decimal string."}, {"name": "detail", "in": "query", "required": false, "schema": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "description": "Cumulative detail level (default matches)."}, {"name": "catalog", "in": "query", "required": false, "schema": {"type": "string", "enum": ["gaia_dr3", "des_y6_gold", "delve_dr3_gold", "skymapper_dr4"], "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, {"name": "separation_arcsec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive).", "x-unit": "arcsec"}, "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive)."}, {"name": "reliability_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "reliability_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "gaia_dr3.parallax_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "response", "in": "query", "required": false, "schema": {"type": "string", "enum": ["objects", "count"], "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}, "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}], "responses": {"200": {"description": "The object, or counts for response=count.", "content": {"application/json": {"schema": {"oneOf": [{"$ref": "#/components/schemas/LookupResponse"}, {"$ref": "#/components/schemas/CountResponse"}]}}}}, "400": {"description": "Invalid diaObjectId, detail, filter, or response; filters_span_catalogs; or query_too_expensive.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Service unavailable; see Retry-After.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/lookup": {"post": {"operationId": "lookup_objects", "summary": "Look up a list of tagged inputs in one request.", "description": "Read-only and idempotent. Every input produces exactly one result, in input order, echoing the input as sent and its normalized form. A malformed input is reported as invalid_input in its own result and does not fail the others; request-level problems are a 400 naming the parameter. \"Not in this service\" (status not_in_service, or no_rubin_object for a position) is not evidence that the object failed a reliability cut or does not exist in Rubin: reliability filtering happens before an alert is stored (at the broker, or at ingest for the cut this service enforces; see reliability_cuts), and the service holds only alerts its brokers delivered.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LookupRequest"}}}}, "responses": {"200": {"description": "One result per input, or counts for response=count.", "content": {"application/json": {"schema": {"oneOf": [{"$ref": "#/components/schemas/LookupResponse"}, {"$ref": "#/components/schemas/CountResponse"}]}}}}, "400": {"description": "Invalid request: body, Content-Type, inputs, detail, a filter, response, or an unknown field; filters_span_catalogs; or query_too_expensive.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Service unavailable; see Retry-After.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/cone": {"get": {"operationId": "cone_search", "summary": "Search one position for every Rubin object within a radius.", "description": "Every Rubin object the service has seen within the radius of the position, crossmatched or not, across the whole archive, each with its own status. A position with no object reports no_rubin_object. Objects whose position could not be indexed at ingest (null HEALPix index) are not reachable by position search; look them up by diaObjectId. Paged in (ingest_time, diaObjectId) order: follow next_cursor until null. The first page pins the object set with as_of. A cursor pins the object set of a paged walk, not the objects' state: an object's status and coincident sources can advance between pages as crossmatching proceeds. as_of bounds ingest time, it is not a snapshot: ingest time is set before an ingest commits, so an object whose ingest commits during the walk can still appear on a later page if its ingest time is at or before as_of. A coincident source is a catalog source within the crossmatch radius of the object position; it is not a host association. The host galaxy of an offset supernova is generally not a coincident source, so the absence of a coincident source is not evidence of a hostless transient.", "parameters": [{"name": "ra", "in": "query", "required": false, "schema": {"type": "number", "x-unit": "deg", "minimum": 0, "maximum": 360}, "description": "Center RA, degrees (ICRS). Required without cursor."}, {"name": "dec", "in": "query", "required": false, "schema": {"type": "number", "x-unit": "deg", "minimum": -90, "maximum": 90}, "description": "Center Dec, degrees (ICRS). Required without cursor."}, {"name": "radius_arcsec", "in": "query", "required": false, "schema": {"type": "number", "x-unit": "arcsec", "exclusiveMinimum": 0, "maximum": 60.0}, "description": "Radius, arcsec. Required without cursor. At most 60 arcsec."}, {"name": "detail", "in": "query", "required": false, "schema": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "description": "Cumulative detail level (default matches)."}, {"name": "page_size", "in": "query", "required": false, "schema": {"type": "integer", "x-unit": "count", "minimum": 1}, "description": "Objects per page (default 100); clamped to 2000."}, {"name": "cursor", "in": "query", "required": false, "schema": {"type": "string"}, "description": "Opaque next_cursor from a prior page; pins ra, dec, radius_arcsec, detail, and as_of. Filters are not pinned: pass them on every page. Not allowed with response=count. A cursor pins the object set of a paged walk, not the objects' state: an object's status and coincident sources can advance between pages as crossmatching proceeds. as_of bounds ingest time, it is not a snapshot: ingest time is set before an ingest commits, so an object whose ingest commits during the walk can still appear on a later page if its ingest time is at or before as_of."}, {"name": "catalog", "in": "query", "required": false, "schema": {"type": "string", "enum": ["gaia_dr3", "des_y6_gold", "delve_dr3_gold", "skymapper_dr4"], "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, {"name": "separation_arcsec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive).", "x-unit": "arcsec"}, "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive)."}, {"name": "reliability_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "reliability_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "gaia_dr3.parallax_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "response", "in": "query", "required": false, "schema": {"type": "string", "enum": ["objects", "count"], "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}, "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}], "responses": {"200": {"description": "One page, or counts for response=count.", "content": {"application/json": {"schema": {"oneOf": [{"$ref": "#/components/schemas/ConeSearchResponse"}, {"$ref": "#/components/schemas/CountResponse"}]}}}}, "400": {"description": "Invalid parameter, filter, or cursor (param names it), filters_span_catalogs, or query_too_expensive.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Service unavailable; see Retry-After.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/tns/{name}": {"get": {"operationId": "resolve_tns", "summary": "Look up a TNS name as a position search around it.", "description": "Resolves the name through the TNS snapshot and returns every Rubin object within the radius of the TNS position, echoing the TNS record and snapshot epoch. The response has the lookup_objects shape with one result. Not paged: at most 100 objects, with truncated and total when capped. When the snapshot is stale or absent the result is resolver_unavailable (still a 200). A coincident source is not a host association, and the absence of one is not evidence of a hostless transient.", "parameters": [{"name": "name", "in": "path", "required": true, "schema": {"type": "string", "maxLength": 64}, "description": "The TNS name, e.g. 2026abc or SN 2026abc."}, {"name": "radius_arcsec", "in": "query", "required": false, "schema": {"type": "number", "x-unit": "arcsec", "exclusiveMinimum": 0, "maximum": 60.0}, "description": "Radius around the TNS position, arcsec (default 1); at most 60."}, {"name": "detail", "in": "query", "required": false, "schema": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "description": "Cumulative detail level (default matches)."}, {"name": "catalog", "in": "query", "required": false, "schema": {"type": "string", "enum": ["gaia_dr3", "des_y6_gold", "delve_dr3_gold", "skymapper_dr4"], "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, {"name": "separation_arcsec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive).", "x-unit": "arcsec"}, "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive)."}, {"name": "reliability_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "reliability_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify."}, {"name": "gaia_dr3.parallax_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmra_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.pmdec_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.ruwe_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_star_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_galaxy_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.classprob_dsc_combmod_quasar_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "gaia_dr3.parallax_over_error_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "des_y6_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_z_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.dnf_zsigma_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_min", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "delve_dr3_gold.ext_mash_max", "in": "query", "required": false, "schema": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies."}, {"name": "response", "in": "query", "required": false, "schema": {"type": "string", "enum": ["objects", "count"], "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}, "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}], "responses": {"200": {"description": "One result, or counts for response=count.", "content": {"application/json": {"schema": {"oneOf": [{"$ref": "#/components/schemas/LookupResponse"}, {"$ref": "#/components/schemas/CountResponse"}]}}}}, "400": {"description": "Invalid name, radius_arcsec, detail, filter, or response; filters_span_catalogs; or query_too_expensive.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Service unavailable; see Retry-After.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/status": {"get": {"operationId": "service_status", "summary": "Service availability, version, and TNS-resolution availability.", "description": "Always 200 for a GET: an unreachable or unresponsive database is reported as database: unavailable rather than as an error. tns_resolution reports whether TNS-name inputs can be resolved now (the TNS snapshot is current).", "responses": {"200": {"description": "The service status.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ServiceStatus"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/describe": {"get": {"operationId": "describe_service", "summary": "Catalogs, vocabulary, and per-request limits.", "description": "The catalogs in service (release, what catalog_source_id means, filterable fields with units, coverage-map resolution), the crossmatch and TNS radii, per-request maximums and budget, detail levels, response modes, generic filters, the broker reliability cut table, and the provenance recording release. Read from the live configuration; needs no database.", "responses": {"200": {"description": "The description.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ServiceDescription"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/api/recent-crossmatches": {"get": {"operationId": "recent_crossmatches", "summary": "Crossmatches for objects with alerts in a time window.", "description": "One keyset page of matched objects whose alert falls in the window, newest first. Matches-only: an object with no catalog match is not listed. Follow next_cursor until null; the walk is pinned by as_of. Does not filter or count: a filter-named parameter (<catalog>.<column>_min|_max, catalog, separation_arcsec_max, reliability_min|_max, or any name with a dot or ending _min/_max) or response is a 400 unsupported_parameter; other unknown parameters are ignored. Runs under the per-request budget of 5 s: a large page at detail=full can exceed it (400 query_too_expensive); use a smaller page_size.", "parameters": [{"name": "start", "in": "query", "required": false, "schema": {"type": "string", "format": "date-time"}, "description": "Window start (inclusive), ISO-8601; naive means UTC. Default: end minus 12 hours. The window may span at most 168 hours."}, {"name": "end", "in": "query", "required": false, "schema": {"type": "string", "format": "date-time"}, "description": "Window end (exclusive), ISO-8601. Default: now."}, {"name": "time_field", "in": "query", "required": false, "schema": {"type": "string", "enum": ["ingest_time", "event_time"]}, "description": "Which alert timestamp the window filters on."}, {"name": "detail", "in": "query", "required": false, "schema": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "description": "Cumulative detail level (default matches)."}, {"name": "page_size", "in": "query", "required": false, "schema": {"type": "integer", "x-unit": "count", "minimum": 1}, "description": "Maximum objects on the page (default 1000); clamped to the operator maximum of 10000."}, {"name": "cursor", "in": "query", "required": false, "schema": {"type": "string"}, "description": "Opaque next_cursor from a prior page; pins start, end, time_field, and detail."}], "responses": {"200": {"description": "One page.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecentCrossmatchesPage"}}}}, "400": {"description": "invalid_parameter (a bad start, end, time_field, detail, page_size, or cursor, or a cursor conflict); unsupported_parameter (a filter or response parameter, which this operation does not support); or query_too_expensive. error repeats message, as in the original error-only body.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "Method not allowed.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Service unavailable; see Retry-After.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}}, "components": {"schemas": {"DiaObjectId": {"type": "integer", "format": "int64", "x-unit": "identifier", "minimum": 0, "description": "Rubin diaObjectId, a 64-bit integer. JavaScript JSON parsers lose precision above 2^53; read diaObjectId_str there instead."}, "DiaObjectIdStr": {"type": "string", "pattern": "^[0-9]+$", "description": "The same diaObjectId as a decimal string."}, "ObjectStatus": {"type": "string", "enum": ["not_in_service", "crossmatch_pending", "coincident_sources", "no_coincident_source", "not_searched"], "description": "What the service knows about one Rubin object. Exactly one per object.\n\n- `not_in_service`: The service has no record of this object. This is not evidence that the object failed a reliability cut or does not exist in Rubin: reliability filtering happens before alerts reach the service.\n- `crossmatch_pending`: Ingested, not yet crossmatched.\n- `coincident_sources`: Crossmatched; at least one catalog source lies within the crossmatch radius. A coincident source is not a host association.\n- `no_coincident_source`: Crossmatched; no source within the crossmatch radius in any catalog that was actually searched. Not evidence of a hostless transient.\n- `not_searched`: Crossmatched, but no catalog was actually searched (every catalog was skipped, outside its footprint, or not searched because of an invalid position)."}, "InputStatus": {"type": "string", "enum": ["no_rubin_object", "objects_found", "tns_name_not_found", "resolver_unavailable", "invalid_input"], "description": "The outcome of one request input (an ID, a position, or a TNS name). Each object inside the input carries its own ObjectStatus.\n\n- `no_rubin_object`: No Rubin object in this service lies within the radius.\n- `objects_found`: One or more Rubin objects matched this input.\n- `tns_name_not_found`: The TNS name is not in the current TNS snapshot (the snapshot epoch is reported).\n- `resolver_unavailable`: TNS-name resolution is unavailable right now; other inputs are unaffected.\n- `invalid_input`: This input is malformed; it is reported here and does not fail the other inputs."}, "CatalogOutcome": {"type": "string", "enum": ["searched", "outside_footprint", "skipped_read_failure", "not_searched_invalid_position", "not_recorded", "not_in_service_at_crossmatch"], "description": "How one catalog was searched for one crossmatched object. \"No coincident source\" applies only to catalogs with outcome `searched`.\n\n- `searched`: The catalog was searched at this position: the position was inside the catalog footprint at the resolution of its HATS coverage map (see coverage_map in api/describe), so an object in a footprint hole or near an edge may be recorded as searched even though the catalog has no data there.\n- `outside_footprint`: The position is outside the catalog footprint.\n- `skipped_read_failure`: The catalog was skipped after a read failure.\n- `not_searched_invalid_position`: Not searched because the object position is invalid.\n- `not_recorded`: No search outcome is recorded for this object; the release that started recording is named.\n- `not_in_service_at_crossmatch`: The catalog was added after this object was crossmatched."}, "ErrorCode": {"type": "string", "enum": ["invalid_parameter", "method_not_allowed", "query_too_expensive", "service_unavailable", "filters_span_catalogs", "unsupported_parameter"], "description": "Request-level error code.\n\n- `invalid_parameter`: A request parameter is invalid; see param or params.\n- `method_not_allowed`: The HTTP method is not supported on this path.\n- `query_too_expensive`: The request exceeded its server-side cost bound. Narrow it; retrying the same request will not help.\n- `service_unavailable`: The service or its database is unavailable. Retry after the Retry-After interval.\n- `filters_span_catalogs`: The match filters name more than one catalog. Match filters apply within one catalog's source; params lists the conflicting parameters.\n- `unsupported_parameter`: This operation does not support the named parameter (for example a filter or response on recent-crossmatches); the request was not run, so unfiltered results are never mistaken for filtered ones."}, "QualifiesReason": {"type": "string", "enum": ["meets_filters", "object_filters_not_met", "no_source_meets_filters", "no_object_meets_filters", "not_in_service", "crossmatch_pending", "no_coincident_source", "not_searched", "no_rubin_object", "tns_name_not_found", "resolver_unavailable", "invalid_input"], "description": "Why an object or input does or does not qualify under the request's filters. Reasons that restate a status reuse its code.\n\n- `meets_filters`: Qualifies: meets every filter in the request.\n- `object_filters_not_met`: Does not qualify: the object fails an object filter (reliability); an object with no stored reliability never meets one.\n- `no_source_meets_filters`: Does not qualify: the object has coincident sources, but no single current source satisfies every match filter. A null or non-numeric stored value never satisfies a filter.\n- `no_object_meets_filters`: Does not qualify: Rubin objects lie within the radius, but none qualifies.\n- `not_in_service`: The service has no record of this object. This is not evidence that the object failed a reliability cut or does not exist in Rubin: reliability filtering happens before alerts reach the service.\n- `crossmatch_pending`: Ingested, not yet crossmatched.\n- `no_coincident_source`: Crossmatched; no source within the crossmatch radius in any catalog that was actually searched. Not evidence of a hostless transient.\n- `not_searched`: Crossmatched, but no catalog was actually searched (every catalog was skipped, outside its footprint, or not searched because of an invalid position).\n- `no_rubin_object`: No Rubin object in this service lies within the radius.\n- `tns_name_not_found`: The TNS name is not in the current TNS snapshot (the snapshot epoch is reported).\n- `resolver_unavailable`: TNS-name resolution is unavailable right now; other inputs are unaffected.\n- `invalid_input`: This input is malformed; it is reported here and does not fail the other inputs."}, "CutEnforcedBy": {"type": "string", "enum": ["service", "broker"], "description": "Where a broker's reliability cut is enforced.\n\n- `service`: Enforced by this service.\n- `broker`: Enforced by the broker before alerts reach this service."}, "CutStatus": {"type": "string", "enum": ["service_setting", "declared", "not_declared"], "description": "How the reported value of a broker's reliability cut is known.\n\n- `service_setting`: The value is this service's own live setting.\n- `declared`: The value is declared by the maintainer as of the stated date; the service does not observe it.\n- `not_declared`: The maintainer has not declared a value."}, "CatalogRelease": {"type": "object", "required": ["name", "release"], "additionalProperties": false, "properties": {"name": {"type": "string", "description": "Catalog name as used in catalog_name."}, "release": {"type": "string", "description": "Catalog release in service."}}}, "ReliabilityCut": {"type": "object", "required": ["broker", "min_reliability", "enforced_by", "status", "as_of"], "additionalProperties": false, "properties": {"broker": {"type": "string", "description": "Broker identifier (e.g. antares)."}, "min_reliability": {"type": ["number", "null"], "x-unit": "probability", "minimum": 0, "maximum": 1, "description": "Minimum LSST real/bogus reliability of the latest diaSource; null when not declared."}, "enforced_by": {"$ref": "#/components/schemas/CutEnforcedBy"}, "status": {"$ref": "#/components/schemas/CutStatus"}, "as_of": {"type": ["string", "null"], "format": "date", "description": "ISO date the maintainer declared a broker-enforced cut; null otherwise."}}}, "Provenance": {"type": "object", "description": "Service-level provenance carried by every response (R17), read from the live service configuration. On this deployment the crossmatch radius is 1.0 arcsec, the catalogs in service are: gaia_dr3 (Gaia DR3), des_y6_gold (DES Y6 Gold), delve_dr3_gold (DELVE DR3 Gold), skymapper_dr4 (SkyMapper DR4), and the minimum LSST reliability per broker is: antares: 0.6 (enforced by broker, declared, as of 2026-10-05); lasair: 0.6 (enforced by broker, declared, as of 2026-10-05); pittgoogle: 0.6 (enforced by service, service_setting).", "required": ["service_version", "contract_version", "crossmatch_radius_arcsec", "catalogs", "reliability_cuts"], "additionalProperties": false, "properties": {"service_version": {"type": ["string", "null"], "description": "Deployed service version; null if unset."}, "contract_version": {"type": "string", "description": "Version of this response contract."}, "crossmatch_radius_arcsec": {"type": ["number", "null"], "x-unit": "arcsec", "description": "Crossmatch radius in arcsec: a catalog source within this angular separation of the object position is coincident."}, "catalogs": {"type": "array", "description": "Catalogs in service, with their releases.", "items": {"$ref": "#/components/schemas/CatalogRelease"}}, "reliability_cuts": {"type": "array", "description": "The reliability cut per broker and where it is enforced (R20). Broker-enforced cuts are declared configuration, not observed by this service.", "items": {"$ref": "#/components/schemas/ReliabilityCut"}}}, "example": {"service_version": "0.16.2", "contract_version": "1.0.0", "crossmatch_radius_arcsec": 1.0, "catalogs": [{"name": "gaia_dr3", "release": "Gaia DR3"}, {"name": "des_y6_gold", "release": "DES Y6 Gold"}, {"name": "delve_dr3_gold", "release": "DELVE DR3 Gold"}, {"name": "skymapper_dr4", "release": "SkyMapper DR4"}], "reliability_cuts": [{"broker": "antares", "min_reliability": 0.6, "enforced_by": "broker", "status": "declared", "as_of": "2026-10-05"}, {"broker": "lasair", "min_reliability": 0.6, "enforced_by": "broker", "status": "declared", "as_of": "2026-10-05"}, {"broker": "pittgoogle", "min_reliability": 0.6, "enforced_by": "service", "status": "service_setting", "as_of": null}]}}, "Envelope": {"type": "object", "description": "Fields every successful response carries.", "required": ["provenance"], "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}}}, "Error": {"type": "object", "description": "A request-level error. `error` repeats `message` for clients of the original error body.", "required": ["error", "code", "message", "retryable"], "additionalProperties": false, "properties": {"error": {"type": "string", "description": "Same as message."}, "code": {"$ref": "#/components/schemas/ErrorCode"}, "message": {"type": "string"}, "param": {"type": "string", "description": "The offending parameter."}, "params": {"type": "array", "items": {"type": "string"}, "description": "The offending parameters, when several."}, "retryable": {"type": "boolean", "description": "Whether retrying the same request can help."}}}, "MatchSummary": {"type": "object", "description": "A coincident source. For each object and each catalog, the crossmatch keeps only the nearest catalog source within the crossmatch radius, so an object has at most one coincident source per catalog; other sources inside the radius are not reported. A coincident source is not a host association.", "required": ["catalog_name", "catalog_source_id", "separation_arcsec"], "properties": {"catalog_name": {"type": "string", "description": "The catalog the source is from."}, "catalog_source_id": {"type": "string", "description": "Source identifier in the catalog named by catalog_name, as a string; unique only within one catalog_name. Per catalog in service:\n\n- `gaia_dr3` (column source_id): The Gaia DR3 source_id: the unique identifier of the Gaia source, a 64-bit integer served as a decimal string. Identifiers are unique only within one catalog_name.\n- `des_y6_gold` (column COADD_OBJECT_ID): The DES Y6 Gold COADD_OBJECT_ID: the unique identifier of the coadd object in the DES Y6 Gold catalog, served as a decimal string. Identifiers are unique only within one catalog_name.\n- `delve_dr3_gold` (column COADD_OBJECT_ID): The DELVE DR3 Gold COADD_OBJECT_ID: the unique identifier of the coadd object in the DELVE DR3 Gold catalog, served as a decimal string. Do not assume it names the same source as an equal DES COADD_OBJECT_ID. Identifiers are unique only within one catalog_name.\n- `skymapper_dr4` (column object_id): The SkyMapper DR4 object_id: the unique identifier of the object in the SkyMapper DR4 master table, served as a decimal string. Identifiers are unique only within one catalog_name."}, "separation_arcsec": {"type": "number", "x-unit": "arcsec", "description": "Angular separation between the Rubin object position and the catalog source position, arcsec; at most the crossmatch radius."}}}, "PublishedMatch": {"type": "object", "description": "A match built by the same payload builder as the Hopskotch stream. ra/dec here are the catalog source position. For each object and each catalog, the crossmatch keeps only the nearest catalog source within the crossmatch radius, so an object has at most one coincident source per catalog; other sources inside the radius are not reported. A coincident source is not a host association.", "required": ["diaObjectId", "ra", "dec", "catalog_name", "catalog_source_id", "separation_arcsec", "catalog_payload", "catalogs_skipped", "partial", "tns_checked", "tns_snapshot_epoch"], "properties": {"diaObjectId": {"$ref": "#/components/schemas/DiaObjectId"}, "ra": {"type": "number", "x-unit": "deg", "description": "Catalog source RA, degrees. Rubin object positions (ra, dec, and searched positions) are ICRS right ascension and declination in degrees; radii and separations are in arcsec. A coincident source position is the catalog's own, in degrees, read from its coordinate columns (gaia_dr3: ra, dec; des_y6_gold: RA, DEC; delve_dr3_gold: RA, DEC; skymapper_dr4: raj2000, dej2000), in the frame and epoch the catalog publishes: the crossmatch compares positions as stored, with no proper motion applied and no epoch propagation. gaia_dr3 positions are at the reference epoch in the ref_epoch payload column (J2016.0 for Gaia DR3). skymapper_dr4 coordinate columns carry a J2000 suffix (raj2000, dej2000) and are published under those names; see the SkyMapper DR4 documentation for their epoch."}, "dec": {"type": "number", "x-unit": "deg", "description": "Catalog source Dec, degrees. Rubin object positions (ra, dec, and searched positions) are ICRS right ascension and declination in degrees; radii and separations are in arcsec. A coincident source position is the catalog's own, in degrees, read from its coordinate columns (gaia_dr3: ra, dec; des_y6_gold: RA, DEC; delve_dr3_gold: RA, DEC; skymapper_dr4: raj2000, dej2000), in the frame and epoch the catalog publishes: the crossmatch compares positions as stored, with no proper motion applied and no epoch propagation. gaia_dr3 positions are at the reference epoch in the ref_epoch payload column (J2016.0 for Gaia DR3). skymapper_dr4 coordinate columns carry a J2000 suffix (raj2000, dej2000) and are published under those names; see the SkyMapper DR4 documentation for their epoch."}, "catalog_name": {"type": "string", "description": "The catalog the source is from."}, "catalog_source_id": {"type": "string", "description": "Source identifier in the catalog named by catalog_name, as a string; unique only within one catalog_name. Per catalog in service:\n\n- `gaia_dr3` (column source_id): The Gaia DR3 source_id: the unique identifier of the Gaia source, a 64-bit integer served as a decimal string. Identifiers are unique only within one catalog_name.\n- `des_y6_gold` (column COADD_OBJECT_ID): The DES Y6 Gold COADD_OBJECT_ID: the unique identifier of the coadd object in the DES Y6 Gold catalog, served as a decimal string. Identifiers are unique only within one catalog_name.\n- `delve_dr3_gold` (column COADD_OBJECT_ID): The DELVE DR3 Gold COADD_OBJECT_ID: the unique identifier of the coadd object in the DELVE DR3 Gold catalog, served as a decimal string. Do not assume it names the same source as an equal DES COADD_OBJECT_ID. Identifiers are unique only within one catalog_name.\n- `skymapper_dr4` (column object_id): The SkyMapper DR4 object_id: the unique identifier of the object in the SkyMapper DR4 master table, served as a decimal string. Identifiers are unique only within one catalog_name."}, "separation_arcsec": {"type": "number", "x-unit": "arcsec", "description": "Angular separation between the Rubin object position and the catalog source position, arcsec; at most the crossmatch radius."}, "catalog_payload": {"type": ["object", "null"], "description": "Raw catalog columns, lowercased keys."}, "catalogs_skipped": {"type": "array", "items": {"type": "string"}}, "partial": {"type": "boolean"}, "tns_checked": {"type": "boolean"}, "tns_snapshot_epoch": {"type": ["string", "null"]}, "tns": {"type": "object"}}}, "RecentObject": {"type": "object", "description": "One object; fields grow with the detail level.", "required": ["diaObjectId", "diaObjectId_str"], "properties": {"diaObjectId": {"$ref": "#/components/schemas/DiaObjectId"}, "diaObjectId_str": {"$ref": "#/components/schemas/DiaObjectIdStr"}, "ra": {"type": ["number", "null"], "x-unit": "deg", "description": "Object RA, degrees (ICRS)."}, "dec": {"type": ["number", "null"], "x-unit": "deg", "description": "Object Dec, degrees (ICRS)."}, "matches": {"type": "array", "items": {"anyOf": [{"$ref": "#/components/schemas/MatchSummary"}, {"$ref": "#/components/schemas/PublishedMatch"}]}}}}, "RecentCrossmatchesPage": {"type": "object", "required": ["provenance", "window", "time_field", "detail", "page_size", "count", "next_cursor", "objects", "as_of"], "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}, "window": {"type": "object", "required": ["start", "end"], "properties": {"start": {"type": "string", "format": "date-time"}, "end": {"type": "string", "format": "date-time"}}}, "time_field": {"type": "string", "enum": ["ingest_time", "event_time"]}, "detail": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "page_size": {"type": "integer", "x-unit": "count", "minimum": 1}, "count": {"type": "integer", "x-unit": "count", "minimum": 0, "description": "Objects on this page, not a total."}, "next_cursor": {"type": ["string", "null"], "description": "Opaque token for the next page; null when the window is exhausted. It pins the window, time_field, detail, and as_of."}, "objects": {"type": "array", "items": {"$ref": "#/components/schemas/RecentObject"}}, "as_of": {"type": "string", "format": "date-time", "description": "The walk is pinned to alerts ingested at or before this time, on every page of one walk (set by the first page; a cursor issued before this field existed pins at the request that presents it). A cursor pins the object set of a paged walk, not the objects' state: an object's status and coincident sources can advance between pages as crossmatching proceeds. as_of bounds ingest time, it is not a snapshot: ingest time is set before an ingest commits, so an object whose ingest commits during the walk can still appear on a later page if its ingest time is at or before as_of. Here that means an object in the pinned set whose first match lands mid-walk can appear on a later page."}}}, "IdInput": {"type": "object", "description": "Look up one Rubin object by diaObjectId.", "required": ["kind", "diaObjectId"], "additionalProperties": false, "properties": {"kind": {"const": "id"}, "diaObjectId": {"description": "The diaObjectId as a JSON integer or a decimal string. Send a string from JavaScript clients, which lose precision above 2^53.", "oneOf": [{"$ref": "#/components/schemas/DiaObjectId"}, {"$ref": "#/components/schemas/DiaObjectIdStr"}]}}}, "PositionInput": {"type": "object", "description": "Search one position for every Rubin object the service has seen within the radius.", "required": ["kind", "ra", "dec"], "additionalProperties": false, "properties": {"kind": {"const": "position"}, "ra": {"type": "number", "x-unit": "deg", "minimum": 0, "maximum": 360, "description": "Right ascension, degrees (ICRS)."}, "dec": {"type": "number", "x-unit": "deg", "minimum": -90, "maximum": 90, "description": "Declination, degrees (ICRS)."}, "radius_arcsec": {"type": "number", "x-unit": "arcsec", "exclusiveMinimum": 0, "maximum": 60.0, "description": "Search radius, arcsec. Required unless the request carries a shared radius_arcsec. At most 60 arcsec."}}}, "TnsInput": {"type": "object", "description": "Look up a TNS name: the name is resolved through the TNS snapshot and answered as a position search around the TNS position.", "required": ["kind", "name"], "additionalProperties": false, "properties": {"kind": {"const": "tns"}, "name": {"type": "string", "maxLength": 64, "description": "A TNS name such as 2026abc, SN 2026abc, or AT2026abc. Whitespace and an SN/AT prefix are ignored and case does not matter."}, "radius_arcsec": {"type": "number", "x-unit": "arcsec", "exclusiveMinimum": 0, "maximum": 60.0, "description": "Search radius around the TNS position, arcsec. Default: the request radius_arcsec, else the TNS association radius (1 arcsec). At most 60 arcsec."}}}, "LookupInput": {"description": "One tagged input, discriminated by kind. An entry that does not match is not a request error: it gets its own result with status invalid_input.", "oneOf": [{"$ref": "#/components/schemas/IdInput"}, {"$ref": "#/components/schemas/PositionInput"}, {"$ref": "#/components/schemas/TnsInput"}]}, "LookupRequest": {"type": "object", "required": ["inputs"], "additionalProperties": false, "properties": {"inputs": {"type": "array", "minItems": 1, "description": "The inputs, answered one result per input in this order; duplicates are answered twice. Per-request maximums (currently: IDs 1000; positions and TNS names together 200) apply; over a maximum the request is a 400 naming inputs. A position or TNS input lists at most 100 objects, and the request at most 2000 objects in all, spent in input order.", "items": {"$ref": "#/components/schemas/LookupInput"}}, "radius_arcsec": {"type": "number", "x-unit": "arcsec", "exclusiveMinimum": 0, "maximum": 60.0, "description": "Shared search radius, arcsec, for position and TNS inputs that carry none. At most 60 arcsec."}, "detail": {"type": "string", "enum": ["ids", "position", "matches", "full"], "description": "Cumulative detail level (default matches)."}, "filters": {"$ref": "#/components/schemas/Filters", "description": "Filters, as {name: value}. With filters every result and object is marked qualifies with a qualifies_reason; nothing is dropped."}, "response": {"type": "string", "enum": ["objects", "count"], "description": "objects (default): the listing. count: counts by input status, object status, and qualifies for the same inputs and filters, without objects (CountResponse)."}}}, "ProvenanceSet": {"type": "object", "description": "The conditions a crossmatch ran under. basis `recorded`: written when the object was crossmatched (R18). basis `best_guess_current_settings`: the current settings, offered for objects without recorded provenance and labeled as a best guess, not a record (R19).", "required": ["basis", "crossmatch_radius_arcsec", "catalogs", "reliability_cuts"], "additionalProperties": false, "properties": {"basis": {"type": "string", "enum": ["recorded", "best_guess_current_settings"]}, "description": {"type": "string"}, "crossmatch_radius_arcsec": {"type": ["number", "null"], "x-unit": "arcsec", "description": "Crossmatch radius, arcsec."}, "catalogs": {"type": "array", "items": {"$ref": "#/components/schemas/CatalogRelease"}}, "reliability_cuts": {"type": "array", "items": {"$ref": "#/components/schemas/ReliabilityCut"}}}}, "Crossmatch": {"type": "object", "description": "What the crossmatch of this object searched, and under which provenance. Without a record (provenance `not_recorded`) every catalog reports `not_recorded`; recording started with service release 0.15.0, but a missing record does not assert that the object predates it.", "required": ["provenance", "match_version", "crossmatched_at", "provenance_set", "brokers_at_crossmatch", "catalog_outcomes"], "additionalProperties": false, "properties": {"provenance": {"type": "string", "enum": ["recorded", "not_recorded"]}, "match_version": {"type": ["integer", "null"], "x-unit": "version", "description": "Version of the stored crossmatch result; it increases when the object is crossmatched again."}, "crossmatched_at": {"type": ["string", "null"], "format": "date-time", "description": "When the crossmatch result was committed."}, "provenance_set": {"type": ["string", "null"], "description": "Key into the response provenance_sets map of the provenance recorded for this crossmatch; null when not recorded."}, "brokers_at_crossmatch": {"type": ["array", "null"], "items": {"type": "string"}, "description": "Brokers that had delivered the object when it was crossmatched. A broker that delivered it later is in the object brokers list only."}, "catalog_outcomes": {"type": "object", "description": "Search outcome per catalog: every catalog in service now, plus any recorded catalog no longer in service.", "additionalProperties": {"$ref": "#/components/schemas/CatalogOutcome"}}, "recording_release": {"type": "string", "description": "Present when not recorded: the service release that started recording provenance."}, "best_guess_provenance_set": {"type": "string", "description": "Present when not recorded: key of the labeled best-guess entry in provenance_sets."}}}, "LookupMatch": {"description": "A coincident source (raw catalog values at detail full). For each object and each catalog, the crossmatch keeps only the nearest catalog source within the crossmatch radius, so an object has at most one coincident source per catalog; other sources inside the radius are not reported. A coincident source is not a host association. A coincident source is a catalog source within the crossmatch radius of the object position; it is not a host association. The host galaxy of an offset supernova is generally not a coincident source, so the absence of a coincident source is not evidence of a hostless transient.", "anyOf": [{"allOf": [{"$ref": "#/components/schemas/MatchSummary"}, {"type": "object", "required": ["provenance_set"], "properties": {"provenance_set": {"type": ["string", "null"], "description": "Key into the response provenance_sets map of the provenance recorded for this crossmatch; null when not recorded."}}}]}, {"allOf": [{"$ref": "#/components/schemas/PublishedMatch"}, {"type": "object", "required": ["provenance_set"], "properties": {"provenance_set": {"type": ["string", "null"], "description": "Key into the response provenance_sets map of the provenance recorded for this crossmatch; null when not recorded."}}}]}]}, "LookupObject": {"type": "object", "description": "One Rubin object. An object not in the service carries only its ID and status. Position, reliability, times, and brokers appear from detail position; matches and tns from detail matches.", "required": ["diaObjectId", "diaObjectId_str", "status"], "additionalProperties": false, "properties": {"diaObjectId": {"$ref": "#/components/schemas/DiaObjectId"}, "diaObjectId_str": {"$ref": "#/components/schemas/DiaObjectIdStr"}, "status": {"$ref": "#/components/schemas/ObjectStatus"}, "ra": {"type": ["number", "null"], "x-unit": "deg", "description": "Object RA, degrees (ICRS)."}, "dec": {"type": ["number", "null"], "x-unit": "deg", "description": "Object Dec, degrees (ICRS)."}, "reliability": {"type": ["number", "null"], "x-unit": "probability", "description": "LSST real/bogus reliability stored when the object was first seen. Alerts below the per-broker cut in provenance.reliability_cuts never reach the service."}, "ingest_time": {"type": "string", "format": "date-time", "description": "When the service first ingested the object."}, "event_time": {"type": "string", "format": "date-time", "description": "Observation time of the first ingested alert."}, "brokers": {"type": "array", "items": {"type": "string"}, "description": "Every broker that has delivered the object."}, "crossmatch": {"description": "Null until the object is crossmatched.", "anyOf": [{"type": "null"}, {"$ref": "#/components/schemas/Crossmatch"}]}, "matches": {"type": "array", "description": "Coincident sources; empty unless status is coincident_sources.", "items": {"$ref": "#/components/schemas/LookupMatch"}}, "tns": {"description": "The stored TNS association; null when the object has none (crossmatched before TNS association was added, or not yet crossmatched).", "anyOf": [{"type": "null"}, {"$ref": "#/components/schemas/ObjectTns"}]}, "separation_arcsec": {"type": "number", "x-unit": "arcsec", "minimum": 0, "description": "Present on position and TNS results only: angular separation of the object position from the searched position, arcsec."}, "qualifies": {"type": "boolean", "description": "Present only when the request has filters: whether this qualifies. Nothing is dropped for not qualifying."}, "qualifies_reason": {"$ref": "#/components/schemas/QualifiesReason", "description": "Present only when the request has filters."}}}, "IdResult": {"type": "object", "description": "The result of an id input: its object and that object's status.", "required": ["index", "kind", "input", "normalized", "status", "objects"], "additionalProperties": false, "properties": {"index": {"type": "integer", "x-unit": "index", "minimum": 0, "description": "Position of the input in the request, from 0."}, "kind": {"const": "id"}, "input": {"description": "The input exactly as sent."}, "normalized": {"type": "object", "required": ["kind", "diaObjectId", "diaObjectId_str"], "additionalProperties": false, "properties": {"kind": {"const": "id"}, "diaObjectId": {"$ref": "#/components/schemas/DiaObjectId"}, "diaObjectId_str": {"$ref": "#/components/schemas/DiaObjectIdStr"}}}, "status": {"$ref": "#/components/schemas/ObjectStatus"}, "objects": {"type": "array", "minItems": 1, "maxItems": 1, "items": {"$ref": "#/components/schemas/LookupObject"}}, "qualifies": {"type": "boolean", "description": "Present only when the request has filters: whether this qualifies. Nothing is dropped for not qualifying."}, "qualifies_reason": {"$ref": "#/components/schemas/QualifiesReason", "description": "Present only when the request has filters."}}}, "TnsRecord": {"type": "object", "description": "The TNS object a name resolved to, from the TNS snapshot.", "required": ["objid", "name", "name_prefix", "ra", "dec", "classification", "redshift", "url"], "additionalProperties": false, "properties": {"objid": {"type": "integer", "x-unit": "identifier", "description": "TNS internal object id."}, "name": {"type": "string", "description": "Bare TNS designation, as TNS stores it."}, "name_prefix": {"type": ["string", "null"], "description": "TNS name prefix, e.g. SN or AT."}, "ra": {"type": "number", "x-unit": "deg", "description": "TNS RA, degrees, as TNS reports it."}, "dec": {"type": "number", "x-unit": "deg", "description": "TNS Dec, degrees, as TNS reports it."}, "classification": {"type": ["string", "null"], "description": "TNS classification, e.g. SN Ia; null if none."}, "redshift": {"type": ["number", "null"], "x-unit": "dimensionless", "description": "TNS redshift; null if none."}, "url": {"type": "string", "description": "The TNS object page."}}}, "ObjectTns": {"type": "object", "description": "The TNS association stored when the object was crossmatched, as of the TNS snapshot it was checked against (snapshot_epoch). It is not refreshed: a TNS object named after that snapshot is not shown, so null name fields mean no TNS object within the association radius as of that snapshot, not that none exists now. checked is false, with a null snapshot_epoch, when no TNS snapshot was current at crossmatch.", "required": ["checked", "snapshot_epoch", "name", "name_prefix", "classification", "redshift", "separation_arcsec", "url"], "additionalProperties": false, "properties": {"checked": {"type": "boolean", "description": "Whether the object was checked against a current TNS snapshot."}, "snapshot_epoch": {"type": ["string", "null"], "format": "date-time", "description": "Epoch of the TNS snapshot the object was checked against; null unless checked."}, "name": {"type": ["string", "null"], "description": "Bare TNS designation of the associated TNS object; null if none."}, "name_prefix": {"type": ["string", "null"], "description": "TNS name prefix, e.g. SN or AT."}, "classification": {"type": ["string", "null"], "description": "TNS classification, e.g. SN Ia; null if none."}, "redshift": {"type": ["number", "null"], "x-unit": "dimensionless", "description": "TNS redshift; null if none."}, "separation_arcsec": {"type": ["number", "null"], "x-unit": "arcsec", "minimum": 0, "description": "Angular separation of the Rubin object position from the TNS object position, arcsec; null if none."}, "url": {"type": ["string", "null"], "description": "The TNS object page; null if none."}}}, "PositionResult": {"type": "object", "description": "The result of a position input: every Rubin object the service has seen within the radius, each with its own status, in (ingest_time, diaObjectId) order. Position searches cover every Rubin object the service has seen, crossmatched or not; an object whose position could not be indexed at ingest (null HEALPix index) is not reachable by position. A coincident source is a catalog source within the crossmatch radius of the object position; it is not a host association. The host galaxy of an offset supernova is generally not a coincident source, so the absence of a coincident source is not evidence of a hostless transient.", "required": ["index", "kind", "input", "normalized", "status", "objects", "total", "truncated", "truncation"], "additionalProperties": false, "properties": {"index": {"type": "integer", "x-unit": "index", "minimum": 0, "description": "Position of the input in the request, from 0."}, "kind": {"const": "position"}, "input": {"description": "The input exactly as sent."}, "normalized": {"type": "object", "required": ["kind", "ra", "dec", "radius_arcsec"], "additionalProperties": false, "properties": {"kind": {"const": "position"}, "ra": {"type": "number", "x-unit": "deg", "description": "RA, degrees (ICRS)."}, "dec": {"type": "number", "x-unit": "deg", "description": "Dec, degrees (ICRS)."}, "radius_arcsec": {"type": "number", "x-unit": "arcsec", "description": "The radius searched, arcsec."}}}, "status": {"type": "string", "enum": ["no_rubin_object", "objects_found"], "description": "Whether any Rubin object lies within the radius.\n\n- `no_rubin_object`: No Rubin object in this service lies within the radius.\n- `objects_found`: One or more Rubin objects matched this input."}, "objects": {"type": "array", "items": {"$ref": "#/components/schemas/LookupObject"}}, "total": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "Rubin objects within the radius; null when no search ran."}, "truncated": {"type": "boolean", "description": "Whether objects lists fewer than total."}, "truncation": {"description": "Why objects was cut: `per_input_limit` (the per-input maximum of 100 objects; run a cone search to page the rest) or `per_request_limit` (the per-request total of 2000 objects, spent in input order). Null when not cut.", "anyOf": [{"type": "null"}, {"type": "string", "enum": ["per_input_limit", "per_request_limit"]}]}, "qualifies": {"type": "boolean", "description": "Present only when the request has filters: whether this qualifies. Nothing is dropped for not qualifying."}, "qualifies_reason": {"$ref": "#/components/schemas/QualifiesReason", "description": "Present only when the request has filters."}, "qualifying_total": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "Present only when the request has filters: qualifying Rubin objects among all objects within the radius (listed or not); null when no search ran."}}}, "TnsResult": {"type": "object", "description": "The result of a TNS input. When the name resolves, it is answered as a position search around the TNS position and echoes the TNS record and snapshot epoch; an unknown name reports tns_name_not_found with the epoch, and a stale or absent snapshot reports resolver_unavailable. Position searches cover every Rubin object the service has seen, crossmatched or not; an object whose position could not be indexed at ingest (null HEALPix index) is not reachable by position. A coincident source is a catalog source within the crossmatch radius of the object position; it is not a host association. The host galaxy of an offset supernova is generally not a coincident source, so the absence of a coincident source is not evidence of a hostless transient.", "required": ["index", "kind", "input", "normalized", "status", "objects", "total", "truncated", "truncation", "tns", "tns_snapshot_epoch"], "additionalProperties": false, "properties": {"index": {"type": "integer", "x-unit": "index", "minimum": 0, "description": "Position of the input in the request, from 0."}, "kind": {"const": "tns"}, "input": {"description": "The input exactly as sent."}, "normalized": {"type": "object", "required": ["kind", "name", "radius_arcsec"], "additionalProperties": false, "properties": {"kind": {"const": "tns"}, "name": {"type": "string", "description": "The bare designation, lowercased, without SN/AT prefix or whitespace; matched against the lowercased TNS name."}, "radius_arcsec": {"type": "number", "x-unit": "arcsec", "description": "The radius searched, arcsec."}}}, "status": {"type": "string", "enum": ["no_rubin_object", "objects_found", "tns_name_not_found", "resolver_unavailable"], "description": "The outcome of the TNS input.\n\n- `no_rubin_object`: No Rubin object in this service lies within the radius.\n- `objects_found`: One or more Rubin objects matched this input.\n- `tns_name_not_found`: The TNS name is not in the current TNS snapshot (the snapshot epoch is reported).\n- `resolver_unavailable`: TNS-name resolution is unavailable right now; other inputs are unaffected."}, "objects": {"type": "array", "items": {"$ref": "#/components/schemas/LookupObject"}}, "total": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "Rubin objects within the radius; null when no search ran."}, "truncated": {"type": "boolean", "description": "Whether objects lists fewer than total."}, "truncation": {"description": "Why objects was cut: `per_input_limit` (the per-input maximum of 100 objects; run a cone search to page the rest) or `per_request_limit` (the per-request total of 2000 objects, spent in input order). Null when not cut.", "anyOf": [{"type": "null"}, {"type": "string", "enum": ["per_input_limit", "per_request_limit"]}]}, "tns": {"description": "The TNS record; null unless the name resolved.", "anyOf": [{"type": "null"}, {"$ref": "#/components/schemas/TnsRecord"}]}, "tns_snapshot_epoch": {"type": ["string", "null"], "format": "date-time", "description": "Epoch of the TNS snapshot the name was resolved against (R21); null when resolver_unavailable."}, "qualifies": {"type": "boolean", "description": "Present only when the request has filters: whether this qualifies. Nothing is dropped for not qualifying."}, "qualifies_reason": {"$ref": "#/components/schemas/QualifiesReason", "description": "Present only when the request has filters."}, "qualifying_total": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "Present only when the request has filters: qualifying Rubin objects among all objects within the radius (listed or not); null when no search ran."}}}, "InvalidInputResult": {"type": "object", "description": "A malformed input. Only this entry fails; the rest of the request is answered.", "required": ["index", "kind", "input", "normalized", "status", "objects", "error"], "additionalProperties": false, "properties": {"index": {"type": "integer", "x-unit": "index", "minimum": 0, "description": "Position of the input in the request, from 0."}, "kind": {"type": ["string", "null"], "description": "The kind as sent, when it was a string."}, "input": {"description": "The input exactly as sent."}, "normalized": {"type": "null"}, "status": {"const": "invalid_input"}, "objects": {"type": "array", "maxItems": 0}, "error": {"type": "object", "required": ["message", "param"], "additionalProperties": false, "properties": {"message": {"type": "string"}, "param": {"type": "string", "description": "The offending field, e.g. inputs[3].diaObjectId."}}}, "qualifies": {"type": "boolean", "description": "Present only when the request has filters: whether this qualifies. Nothing is dropped for not qualifying."}, "qualifies_reason": {"$ref": "#/components/schemas/QualifiesReason", "description": "Present only when the request has filters."}}}, "LookupResult": {"description": "One result per input, in input order.", "oneOf": [{"$ref": "#/components/schemas/IdResult"}, {"$ref": "#/components/schemas/PositionResult"}, {"$ref": "#/components/schemas/TnsResult"}, {"$ref": "#/components/schemas/InvalidInputResult"}]}, "LookupResponse": {"type": "object", "required": ["provenance", "detail", "count", "provenance_sets", "truncated", "results"], "additionalProperties": false, "properties": {"truncated": {"type": "boolean", "description": "Whether the per-request object total cut any result; those results carry truncation `per_request_limit`."}, "provenance": {"$ref": "#/components/schemas/Provenance"}, "detail": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "count": {"type": "integer", "x-unit": "count", "minimum": 0, "description": "Number of results (equal to the number of inputs)."}, "provenance_sets": {"type": "object", "description": "Provenance sets referenced by the results, keyed by the keys objects and matches carry.", "additionalProperties": {"$ref": "#/components/schemas/ProvenanceSet"}}, "results": {"type": "array", "items": {"$ref": "#/components/schemas/LookupResult"}}, "filters": {"$ref": "#/components/schemas/Filters", "description": "Present only when the request has filters: the filters applied, normalized."}}}, "ConeSearchResponse": {"type": "object", "description": "One page of a single cone search: the lookup response shape with one position result, whose objects are this page.", "required": ["provenance", "detail", "count", "provenance_sets", "truncated", "results", "as_of", "page_size", "next_cursor"], "additionalProperties": false, "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}, "detail": {"type": "string", "enum": ["ids", "position", "matches", "full"]}, "count": {"const": 1, "description": "Number of results."}, "provenance_sets": {"type": "object", "additionalProperties": {"$ref": "#/components/schemas/ProvenanceSet"}}, "truncated": {"const": false, "description": "Always false: a single cone pages instead."}, "results": {"type": "array", "minItems": 1, "maxItems": 1, "items": {"$ref": "#/components/schemas/PositionResult"}}, "as_of": {"type": "string", "format": "date-time", "description": "The object set is pinned to objects ingested at or before this time, on every page of one walk. A cursor pins the object set of a paged walk, not the objects' state: an object's status and coincident sources can advance between pages as crossmatching proceeds. as_of bounds ingest time, it is not a snapshot: ingest time is set before an ingest commits, so an object whose ingest commits during the walk can still appear on a later page if its ingest time is at or before as_of."}, "page_size": {"type": "integer", "x-unit": "count", "minimum": 1}, "next_cursor": {"type": ["string", "null"], "description": "Opaque token for the next page; null on the last."}, "filters": {"$ref": "#/components/schemas/Filters", "description": "Present only when the request has filters: the filters applied, normalized."}}}, "Filters": {"type": "object", "description": "Filters (R13, R14). Bounds are inclusive. Catalog property filters are named <catalog>.<column>_min|_max with the column lowercased; they, catalog, and separation_arcsec_max are match filters, and an object qualifies only if one of its current coincident sources satisfies every match filter, so match filters may name only one catalog (else 400 filters_span_catalogs). reliability_min|_max are object filters. A null or non-numeric stored value never qualifies. An unknown filter name is a 400 naming it.", "additionalProperties": false, "properties": {"catalog": {"type": "string", "enum": ["gaia_dr3", "des_y6_gold", "delve_dr3_gold", "skymapper_dr4"], "description": "Match filter: only coincident sources from this catalog count. It names a catalog, so it cannot be combined with a filter on another catalog."}, "separation_arcsec_max": {"type": "number", "description": "Match filter: only coincident sources at most this far from the object count, arcsec (inclusive).", "x-unit": "arcsec"}, "reliability_min": {"type": "number", "description": "Object filter: inclusive minimum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "reliability_max": {"type": "number", "description": "Object filter: inclusive maximum of the object's stored LSST reliability; an object with none does not qualify.", "x-unit": "probability"}, "gaia_dr3.parallax_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "gaia_dr3.parallax_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "gaia_dr3.parallax_error_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "gaia_dr3.parallax_error_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column parallax_error, as stored with the match; unit: mas. A null or non-numeric stored value never qualifies.", "x-unit": "mas"}, "gaia_dr3.pmra_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "gaia_dr3.pmra_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmra, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "gaia_dr3.pmdec_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "gaia_dr3.pmdec_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column pmdec, as stored with the match; unit: mas/yr. A null or non-numeric stored value never qualifies.", "x-unit": "mas/yr"}, "gaia_dr3.ruwe_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "gaia_dr3.ruwe_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column ruwe, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "gaia_dr3.classprob_dsc_combmod_star_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.classprob_dsc_combmod_star_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_star, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.classprob_dsc_combmod_galaxy_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.classprob_dsc_combmod_galaxy_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_galaxy, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.classprob_dsc_combmod_quasar_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.classprob_dsc_combmod_quasar_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 catalog column classprob_dsc_combmod_quasar, as stored with the match; unit: probability. A null or non-numeric stored value never qualifies.", "x-unit": "probability"}, "gaia_dr3.parallax_over_error_min": {"type": "number", "description": "Match filter: inclusive minimum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "gaia_dr3.parallax_over_error_max": {"type": "number", "description": "Match filter: inclusive maximum of gaia_dr3 parallax / parallax_error, computed from the stored values (signed; unusable, so never qualifying, when either is missing or the denominator is 0); unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "des_y6_gold.dnf_z_min": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "des_y6_gold.dnf_z_max": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "des_y6_gold.dnf_zsigma_min": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "des_y6_gold.dnf_zsigma_max": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "des_y6_gold.ext_mash_min": {"type": "number", "description": "Match filter: inclusive minimum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "des_y6_gold.ext_mash_max": {"type": "number", "description": "Match filter: inclusive maximum of des_y6_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "delve_dr3_gold.dnf_z_min": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "delve_dr3_gold.dnf_z_max": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_Z, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "delve_dr3_gold.dnf_zsigma_min": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "delve_dr3_gold.dnf_zsigma_max": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column DNF_ZSIGMA, as stored with the match; unit: dimensionless. A null or non-numeric stored value never qualifies.", "x-unit": "dimensionless"}, "delve_dr3_gold.ext_mash_min": {"type": "number", "description": "Match filter: inclusive minimum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}, "delve_dr3_gold.ext_mash_max": {"type": "number", "description": "Match filter: inclusive maximum of delve_dr3_gold catalog column EXT_MASH, as stored with the match; unit: class code (0-4). A null or non-numeric stored value never qualifies.", "x-unit": "class code (0-4)"}}}, "CountResponse": {"type": "object", "description": "The response=count body (R15): counts for the same inputs and filters as the listing, without objects and uncapped by the listing limits.", "required": ["provenance", "response", "filters", "counts"], "additionalProperties": false, "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}, "response": {"const": "count"}, "filters": {"description": "The filters applied, normalized; null when none.", "anyOf": [{"type": "null"}, {"$ref": "#/components/schemas/Filters"}]}, "counts": {"type": "object", "required": ["inputs", "objects"], "additionalProperties": false, "properties": {"inputs": {"type": "object", "description": "Per input, duplicates included. by_status keys are ObjectStatus (id inputs) and InputStatus values.", "required": ["total", "by_status", "qualifying"], "additionalProperties": false, "properties": {"total": {"type": "integer", "x-unit": "count", "minimum": 0}, "by_status": {"type": "object", "description": "Count per status; every status is present, zero-filled.", "additionalProperties": {"type": "integer", "x-unit": "count", "minimum": 0}}, "qualifying": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "How many qualify under the filters; null without filters."}}}, "objects": {"type": "object", "description": "Per distinct Rubin object the inputs reach (IDs, and every object within each radius). by_status keys are ObjectStatus values.", "required": ["total", "by_status", "qualifying", "by_qualifies_reason"], "additionalProperties": false, "properties": {"total": {"type": "integer", "x-unit": "count", "minimum": 0}, "by_status": {"type": "object", "description": "Count per status; every status is present, zero-filled.", "additionalProperties": {"type": "integer", "x-unit": "count", "minimum": 0}}, "qualifying": {"type": ["integer", "null"], "x-unit": "count", "minimum": 0, "description": "How many qualify under the filters; null without filters."}, "by_qualifies_reason": {"type": ["object", "null"], "description": "Count per QualifiesReason, zero-filled (meets_filters, object_filters_not_met, no_source_meets_filters, not_in_service, crossmatch_pending, no_coincident_source, not_searched); null without filters.", "additionalProperties": {"type": "integer", "x-unit": "count", "minimum": 0}}}}}}}}, "ServiceStatus": {"type": "object", "description": "Service availability (R30). Always returned with 200: a database that cannot be reached, or does not answer a trivial query within 1 s, is reported as database: unavailable, not as an error.", "required": ["provenance", "database", "service_version", "contract_version", "tns_resolution", "tns_snapshot_epoch"], "additionalProperties": false, "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}, "database": {"type": "string", "enum": ["ok", "unavailable"], "description": "ok: the database answered. unavailable: it did not; queries will fail with 503 service_unavailable until it recovers."}, "service_version": {"type": ["string", "null"], "description": "Deployed service version; null if unset."}, "contract_version": {"type": "string", "description": "Version of the response contract."}, "tns_resolution": {"type": "string", "enum": ["available", "unavailable"], "description": "available: the TNS snapshot is current, so TNS-name inputs resolve. unavailable: the snapshot is stale or absent, or the database is unavailable; TNS-name inputs report resolver_unavailable."}, "tns_snapshot_epoch": {"type": ["string", "null"], "format": "date-time", "description": "When the current TNS snapshot was last refreshed; null unless tns_resolution is available."}}}, "FilterableField": {"type": "object", "description": "One filterable catalog property.", "required": ["name", "unit", "description", "column", "derived_from", "parameters"], "additionalProperties": false, "properties": {"name": {"type": "string", "description": "Public property name (lowercased)."}, "unit": {"type": "string", "description": "Unit of the value."}, "description": {"type": "string"}, "column": {"type": ["string", "null"], "description": "The stored catalog column (upstream-native case); null for a derived property."}, "derived_from": {"type": ["object", "null"], "description": "For a derived property, the numerator / denominator columns it is computed from; null otherwise.", "required": ["numerator", "denominator"], "additionalProperties": false, "properties": {"numerator": {"type": "string"}, "denominator": {"type": "string"}}}, "parameters": {"type": "array", "items": {"type": "string"}, "description": "The filter parameters (_min, _max) on this property."}}}, "CatalogDescription": {"type": "object", "description": "One catalog in service.", "required": ["name", "release", "catalog_source_id", "filterable_fields", "coverage_map"], "additionalProperties": false, "properties": {"name": {"type": "string", "description": "Catalog name as used in catalog_name."}, "release": {"type": "string", "description": "Release in service."}, "catalog_source_id": {"type": "object", "description": "What catalog_source_id means for this catalog.", "required": ["column", "description"], "additionalProperties": false, "properties": {"column": {"type": "string", "description": "The catalog column it is read from."}, "description": {"type": "string"}}}, "filterable_fields": {"type": "array", "items": {"$ref": "#/components/schemas/FilterableField"}}, "coverage_map": {"type": "object", "description": "The resolution at which catalog outcome searched is decided: the configured max HEALPix order of the catalog's HATS coverage map. Objects in footprint holes or near edges smaller than a pixel may be recorded as searched.", "required": ["footprint_moc_order", "resolution_arcmin", "note"], "additionalProperties": false, "properties": {"footprint_moc_order": {"type": ["integer", "null"], "x-unit": "HEALPix order", "minimum": 0, "maximum": 29, "description": "HEALPix order; null if not configured."}, "resolution_arcmin": {"type": ["number", "null"], "x-unit": "arcmin", "description": "Mean pixel side at that order, arcmin; null if not configured."}, "note": {"type": "string"}}}}}, "ServiceDescription": {"type": "object", "description": "The catalogs, vocabulary, and per-request limits of the service (KTD16), read from the live configuration.", "required": ["provenance", "catalogs", "crossmatch", "tns", "limits", "detail_levels", "default_detail", "response_modes", "generic_filters", "reliability_cuts", "provenance_recording_release", "mcp"], "additionalProperties": false, "properties": {"provenance": {"$ref": "#/components/schemas/Provenance"}, "catalogs": {"type": "array", "items": {"$ref": "#/components/schemas/CatalogDescription"}}, "mcp": {"type": "object", "description": "The public, read-only MCP endpoint for chat assistants (R14). Its tools answer from the same lookups as this API.", "required": ["path", "method", "transport", "authentication", "description", "tools"], "additionalProperties": false, "properties": {"path": {"type": "string", "description": "Site-relative path of the endpoint."}, "method": {"type": "string", "description": "HTTP method: POST."}, "transport": {"type": "string", "description": "streamable_http: MCP Streamable HTTP, JSON-RPC over POST answered with a JSON body."}, "authentication": {"type": "string", "description": "none: no login; connect with the URL alone."}, "description": {"type": "string"}, "tools": {"type": "array", "description": "The tools tools/list serves, in order.", "items": {"type": "object", "required": ["name", "title"], "additionalProperties": false, "properties": {"name": {"type": "string"}, "title": {"type": "string"}}}}}}, "crossmatch": {"type": "object", "required": ["radius_arcsec", "nearest_source_per_catalog", "description"], "additionalProperties": false, "properties": {"radius_arcsec": {"type": ["number", "null"], "x-unit": "arcsec", "description": "Crossmatch radius, arcsec."}, "nearest_source_per_catalog": {"type": "boolean", "description": "True: only the nearest source per catalog within the radius is kept."}, "description": {"type": "string"}}}, "tns": {"type": "object", "required": ["default_radius_arcsec", "max_radius_arcsec"], "additionalProperties": false, "properties": {"default_radius_arcsec": {"type": "number", "x-unit": "arcsec", "description": "Default radius around a TNS position, arcsec."}, "max_radius_arcsec": {"type": "number", "x-unit": "arcsec", "description": "Largest radius a request may set, arcsec."}}}, "limits": {"type": "object", "description": "Per-request maximums and the request budget (KTD12). A request over a maximum is a 400 naming the parameter; one over the budget is a 400 query_too_expensive.", "required": ["request_budget_seconds", "max_ids", "max_positions", "max_cone_radius_arcsec", "max_objects_per_position", "max_objects_per_request", "recent_crossmatches"], "additionalProperties": false, "properties": {"request_budget_seconds": {"type": "number", "x-unit": "s"}, "max_ids": {"type": "integer", "x-unit": "count", "minimum": 0}, "max_positions": {"type": "integer", "x-unit": "count", "minimum": 0}, "max_cone_radius_arcsec": {"type": "number", "x-unit": "arcsec"}, "max_objects_per_position": {"type": "integer", "x-unit": "count", "minimum": 0}, "max_objects_per_request": {"type": "integer", "x-unit": "count", "minimum": 0}, "recent_crossmatches": {"type": "object", "required": ["default_page_size", "max_page_size", "max_window_hours"], "additionalProperties": false, "properties": {"default_page_size": {"type": "integer", "x-unit": "count", "minimum": 0}, "max_page_size": {"type": "integer", "x-unit": "count", "minimum": 0}, "max_window_hours": {"type": "integer", "x-unit": "h", "minimum": 0}}}}}, "detail_levels": {"type": "array", "description": "Cumulative detail levels. ids: diaObjectId, status, and the crossmatch block (per-catalog search outcomes and recorded provenance).; position: ids plus the object position (ra, dec, degrees), reliability, ingest_time, event_time, and delivering brokers.; matches: position plus the coincident sources: catalog_name, catalog_source_id, and separation_arcsec.; full: matches plus each source as published on Hopskotch: the catalog payload columns (lowercased keys) and the TNS enrichment.", "items": {"type": "object", "required": ["name", "description"], "additionalProperties": false, "properties": {"name": {"type": "string"}, "description": {"type": "string"}}}}, "default_detail": {"type": "string"}, "response_modes": {"type": "array", "description": "Values of response. objects: The listing of results and objects (default).; count: Counts by input status, object status, and qualifies for the same inputs and filters, without objects and uncapped by the listing limits.", "items": {"type": "object", "required": ["name", "description"], "additionalProperties": false, "properties": {"name": {"type": "string"}, "description": {"type": "string"}}}}, "generic_filters": {"type": "array", "description": "Filters not tied to a catalog property; catalog property filters are listed per catalog.", "items": {"type": "object", "required": ["name", "kind", "bound", "unit", "is_match_filter", "description"], "additionalProperties": false, "properties": {"name": {"type": "string"}, "kind": {"type": "string"}, "bound": {"type": ["string", "null"], "enum": ["min", "max", null]}, "unit": {"type": ["string", "null"]}, "is_match_filter": {"type": "boolean"}, "description": {"type": "string"}}}}, "reliability_cuts": {"type": "array", "items": {"$ref": "#/components/schemas/ReliabilityCut"}}, "provenance_recording_release": {"type": "string", "description": "The service release that started recording per-object crossmatch provenance; objects crossmatched earlier report it as not recorded."}}}}}}