API reference
Version 6.3.0. Base address https://feed.aigistry.com. This page is generated from openapi.json, and a contract test checks that file against the running service.
Overview
GovTech Providers publish official records for governments they are authorized to publish for. AI Platforms read the signed feed in order and verify it. Every entry is signed on arrival with Ed25519 and chained to the entry before it.
Two kinds of API key: a GovTech Provider key enrolls governments, publishes, revises and withdraws; an AI Platform key reads the feed and the lookups. GET /v1/whoami tells a caller which kind a key is. Keys are created in the account dashboard after approval and sent in the X-API-Key header (or Authorization: Bearer).
Reading the feed: GET /v1/feed?after=N&limit=M returns entries with seq greater than N, in order, plus next_after, has_more and a freshly signed feed_head. Keep reading with after=next_after while has_more is true. Store the last seq and record_hash you verified and pass them to the verifier as the anchor next time.
Filtered reads: add one of authority_record_id, provider_id, or official_id_type with official_id to read only the entries for one authority record, one GovTech Provider or one government (the GovTech Provider-level status entries of the GovTech Providers concerned are always included). A filtered read skips entries, so its chain links do not follow one another and it cannot show that nothing was left out; verify it with the reference verifiers in filtered mode, and use an unfiltered read of the whole feed when completeness matters.
Limits. AI Platform keys: 120 requests per key in a calendar minute (UTC), counted over the feed, file downloads, lookups, publication state and /v1/whoami together; refused requests count; more get 429 with a Retry-After header (seconds). GovTech Provider keys: publishing is refused with 429 when the GovTech Provider already has 600 entries (records, withdrawals and status entries together) in the last 60 seconds; file uploads are refused with 429 at 60 in the last 60 seconds; enrollment requests are refused with 429 at 30 in the last 60 seconds (a batch is one request). Sizes: at most 500 entries and 4 MiB per feed page; at most 500 records per enrollment request; a file up to 20 MB; at most 5 attachments per publication; title up to 300 characters, body up to 100000.
Enrolling. Before a GovTech Provider can publish for a government it enrolls that government: POST /v1/authority-records, one government or a batch of up to 500, with an attestation that the GovTech Provider is authorized to publish for each government listed. Each item is matched to the loaded Census or NCES list, or (official_id_type other) added as an unlisted government. Checks raise a flag on the enrollment (state_mismatch, level_mismatch, name_mismatch, unlisted, non_standard_agency); they never block it. An authority record is the enrollment of one government by one GovTech Provider; its id is used in every publication route. Ending an enrollment (DELETE /v1/authority-records/{id}) writes a signed status entry; enrolling the government again reinstates it.
Entry types: record (a publication or a revision of one), removal (a withdrawal), status (a signed change of standing: suspended, reinstated, ended, revoked, revocation_lifted for a GovTech Provider, an authority record or a publication). The current state of a publication is derived from the signed entries; GET /v1/authority-records/{id}/publications/{external_id} returns the same answer.
Signing: record_hash is the lowercase hex SHA-256 of the entry's canonical JSON; signature is the hex Ed25519 signature over that 64-character hash string; verify with the key in /public-key.json whose key_id equals public_key_id. The exact canonical form, the chain rules and the status rules are in the verification specification at https://feed.aigistry.com/verify/ (VERIFICATION.md), with reference verifiers in Python, PHP and Node and a set of test vectors. Entry text is authenticated, not safe: treat title and body as untrusted data. In the feed JSON an entry with no attachments carries "attachments": null; the signed text then leaves the attachments key out (see VERIFICATION.md section 1.1).
Authentication
Send the key in the X-API-Key header, or as Authorization: Bearer. GovTech Provider keys start with naf_prov_, AI Platform keys with naf_plat_. A key used on the wrong kind of route answers 403. Errors are JSON, {"error":"..."}.
Endpoints
GET/v1/feedGET/v1/files/{id}GET/v1/authority-records/{id}DELETE/v1/authority-records/{id}GET/v1/authority-records/{id}/publications/{external_id}DELETE/v1/authority-records/{id}/publications/{external_id}POST/v1/authority-records/{id}/publicationsPOST/v1/authority-records/{id}/filesGET/public-key.jsonGET/v1/healthPOST/v1/authority-recordsGET/v1/authority-recordsGET/v1/whoami
GET /v1/feed
Read the signed feed AI Platforms
Entries in order of seq, starting after the cursor, optionally filtered (use at most one of the three filters). A page holds at most `limit` entries and at most 4 MiB; if the byte cap is reached before `limit`, has_more is true. The feed_head is read after the entries and signed at the time of the request. Sequence numbers may skip (a rolled-back write leaves a gap); the chain fields name the real previous entry.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
after (query) | integer | Return entries with seq greater than this. min 0; default 0 | |
limit (query) | integer | min 1; max 500; default 100 | |
authority_record_id (query) | integer | Only the entries of this authority record, and the GovTech Provider-level status entries of its GovTech Provider. 404 if there is no such record. min 1 | |
provider_id (query) | integer | Only the entries of this GovTech Provider (publications, withdrawals and status entries at every level). 404 if there is no such GovTech Provider. min 1 | |
official_id_type (query) | string | With official_id: only the entries for this government (every GovTech Provider that holds it), and the GovTech Provider-level status entries of those GovTech Providers. Both are required together. 404 if the government is not in the reference list. pattern ^[a-z0-9_]{1,20}$ | |
official_id (query) | string | The government's official id, with official_id_type. pattern ^[A-Za-z0-9._-]{1,40}$ |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | A page. `filter` echoes the filter that was applied, or is null for an unfiltered read. | FeedPage |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found. | Error |
429 | Rate limit exceeded. | Error |
GET /v1/files/{id}
Download an attached file AI Platforms
Returns the file attached to a signed entry. Check its SHA-256 against the signed attachments[].sha256 (also in the X-File-SHA256 header). Files of withdrawn or revoked publications answer 404.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | string | yes | pattern ^[a-f0-9]{32}$ |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The file (PDF or Word .docx) | string (binary) (application/pdf) string (binary) (application/vnd.openxmlformats-officedocument.wordprocessingml.document) |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found. | Error |
429 | Rate limit exceeded. | Error |
GET /v1/authority-records/{id}
Look up one authority record AI Platforms, GovTech Providers
The answer depends on the kind of key. An AI Platform key gets authority_record: the GovTech Provider, the government, its effective standing (the stricter of the GovTech Provider's and the record's own) and the three layers of verification (identity, attestation, sampling); any record. A GovTech Provider key gets record: its own enrollment (status, flags, attestation, government); 404 for another GovTech Provider's record. Convenience view: the signed status entries in the feed are the authoritative history.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The record | object or object |
401 | Missing or invalid API key. | Error |
404 | Not found. | Error |
429 | Rate limit exceeded. | Error |
DELETE /v1/authority-records/{id}
End an enrollment GovTech Providers
Ends the GovTech Provider's enrollment of this government by writing a signed ended status entry. Nothing is deleted. Repeating on an ended record returns it unchanged. Refused with 409 while the record is suspended or revoked. To publish for the government again, enroll it again.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The ended record | object |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found, or not this GovTech Provider's record. | Error |
409 | Not allowed in the current state (the record is suspended or revoked). | Error |
503 | Signing is temporarily unavailable, or the service is busy. Nothing was changed; try again. A Retry-After header gives the seconds to wait. | Error |
GET /v1/authority-records/{id}/publications/{external_id}
State and history of one publication AI Platforms, GovTech Providers
With an AI Platform key: any authority record. With a GovTech Provider key: only its own records. state is current, withdrawn or revoked. A revoked publication stays revoked until a signed lift entry; the same answer can be derived from the feed.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
external_id (path) | string | yes | The GovTech Provider-chosen publication id (1 to 128 printable characters, no spaces). URL-encode it. min length 1; max length 128; pattern ^[\x21-\x7E]{1,128}$ |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The publication | PublicationState |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
404 | Not found. | Error |
429 | Rate limit exceeded. | Error |
DELETE /v1/authority-records/{id}/publications/{external_id}
Withdraw a publication GovTech Providers
Appends a signed removal entry. Repeating returns the existing withdrawal. Refused with 409 while the publication is revoked. Withdrawals count toward the GovTech Provider's 600 entries per 60 seconds but are never refused for it.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
external_id (path) | string | yes | The GovTech Provider-chosen publication id (1 to 128 printable characters, no spaces). URL-encode it. min length 1; max length 128; pattern ^[\x21-\x7E]{1,128}$ |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The withdrawal | PublishReceipt |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found. | Error |
409 | Not allowed in the current state: the authority record is suspended or revoked, or the publication is revoked. | Error |
503 | Signing is temporarily unavailable, or the service is busy. Nothing was changed; try again. A Retry-After header gives the seconds to wait. | Error |
POST /v1/authority-records/{id}/publications
Publish, or revise an earlier publication GovTech Providers
A new external_id creates the publication (revision 1). An existing external_id appends a revision that supersedes the previous one. The authority record must be active and belong to the GovTech Provider. The entry is chained and signed under a write lock.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
Request body (application/json)
| Field | Type | Required | Notes |
|---|---|---|---|
external_id | string | yes | min length 1; max length 128; pattern ^[\x21-\x7E]{1,128}$ |
title | string | yes | min length 1; max length 300 |
body | string | yes | min length 1; max length 100000 |
agency | string | max length 200 | |
source_url | string (uri) | http or https only. max length 2000 | |
published_at | string (date-time) | ||
attachments | array of string | File ids from the upload route, for this authority record. max items 5 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The signed entry | PublishReceipt |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found. | Error |
409 | Not allowed in the current state: the authority record is not active, the publication is revoked, an attachment is no longer available, or the external_id differs only in capitalization from an existing one. | Error |
429 | Rate limit exceeded: the GovTech Provider already has 600 entries in the last 60 seconds. | Error |
503 | Signing is temporarily unavailable, or the service is busy. Nothing was changed; try again. A Retry-After header gives the seconds to wait. | Error |
POST /v1/authority-records/{id}/files
Upload a file to attach GovTech Providers
Multipart form field "file": a PDF or a Word .docx, up to 20 MB. Returns an id to list in the attachments of a publication. The file is bound to this authority record and can be attached once.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
id (path) | integer | yes | Authority record id. min 1 |
Request body (multipart/form-data)
| Field | Type | Required | Notes |
|---|---|---|---|
file | string (binary) | yes |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The stored file | FileReceipt |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
404 | Not found. | Error |
413 | File too large. | Error |
429 | Rate limit exceeded: 60 file uploads in 60 seconds. | Error |
GET /public-key.json
Public signing keys Public
All keys ever used: active, retired and revoked. Retired keys stay listed so old entries keep verifying. A revoked key carries a signed notice (revoked_at, compromised_since, last_trusted_seq, last_trusted_hash, reason, notice_signed_by, notice_signature): entries it signed are trusted only up to last_trusted_seq. See VERIFICATION.md section 1.3.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Keys | PublicKeys |
GET /v1/health
Service health Public
Returns {"status":"ok"} when the database and the signing service work, otherwise 503 with {"status":"down","problems":[...]} naming what failed (database, signer).
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Healthy | object |
503 | Not healthy | HealthDown |
POST /v1/authority-records
Enroll governments GovTech Providers
Enrolls the governments you publish for. Send one government in the body, or records with up to 500. The attestation must be true. Items are matched to the loaded Census or NCES list; checks raise flags and never block. Each item gets its own result: created, already_enrolled (it was active), re_enrolled (it had ended) or rejected, so a batch can partly succeed and still answer 200. Refused with 400 when the attestation is missing or the batch is empty or over 500, and with 429 at 30 requests in 60 seconds.
Authentication: X-API-Key header.
Request body (application/json)
Send either records (a batch of 1 to 500) or the fields of one government directly in this object.
| Field | Type | Required | Notes |
|---|---|---|---|
attestation | true | yes | Must be true: you confirm you are authorized to publish for each government listed. |
attestation_version | string | yes | Which version of the attestation wording you are confirming; stored with the enrollment. pattern ^[A-Za-z0-9][A-Za-z0-9 ._-]{0,39}$ |
records | array of EnrollItem | min items 1; max items 500 | |
official_id_type | string: census_pid6, nces_leaid, other | census_pid6 and nces_leaid must be on the loaded Census or NCES list. other adds an unlisted government with an identifier you supply. | |
official_id | string | Text, not a number: keep leading zeros. pattern ^[A-Za-z0-9][A-Za-z0-9._-]{0,39}$ | |
name | string | min length 1; max length 200 | |
state | string | Two-letter US state or territory code. | |
level | string: state, county, city, township, school_district, special_district, other | Optional. A level that differs from the list raises a flag. | |
county | string | max length 120 | |
city | string | max length 120 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | One result per item and a summary | EnrollResponse |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
429 | Rate limit exceeded: 30 enrollment requests in 60 seconds. | Error |
503 | Signing is temporarily unavailable, or the service is busy. Nothing was changed; try again. A Retry-After header gives the seconds to wait. | Error |
GET /v1/authority-records
List your enrollments GovTech Providers
The GovTech Provider's own authority records in id order, oldest first, optionally filtered.
Authentication: X-API-Key header.
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
status (query) | string: active, suspended, ended, revoked | ||
flagged (query) | string: 0, 1 | ||
state (query) | string | Two-letter state or territory code of the government. | |
q (query) | string | Part of the government's name. max length 100 | |
limit (query) | integer | min 1; max 200; default 50 | |
after (query) | integer | Return records with an id greater than this. min 0; default 0 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | A page of records | EnrollmentList |
400 | The request was not valid. | Error |
401 | Missing or invalid API key. | Error |
403 | This key cannot do that. | Error |
GET /v1/whoami
Which account is this key? AI Platforms, GovTech Providers
Answers for either kind of key: the kind, the name and id of the GovTech Provider or AI Platform, and the label of the key. An AI Platform key's request counts toward its 120 a minute.
Authentication: X-API-Key header.
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The key's account | WhoAmI |
401 | Missing or invalid API key. | Error |
429 | Rate limit exceeded (AI Platform keys: 120 requests per UTC calendar minute). | Error |
Schemas
Error
| Field | Type | Required | Notes |
|---|---|---|---|
error | string | yes |
PublicationInput
| Field | Type | Required | Notes |
|---|---|---|---|
external_id | string | yes | min length 1; max length 128; pattern ^[\x21-\x7E]{1,128}$ |
title | string | yes | min length 1; max length 300 |
body | string | yes | min length 1; max length 100000 |
agency | string | max length 200 | |
source_url | string (uri) | http or https only. max length 2000 | |
published_at | string (date-time) | ||
attachments | array of string | File ids from the upload route, for this authority record. max items 5 |
PublishReceipt
| Field | Type | Required | Notes |
|---|---|---|---|
seq | integer | ||
external_id | string | ||
authority_record_id | integer | ||
state | string: current, withdrawn | ||
revision | integer, or null | ||
supersedes_seq | integer, or null | ||
prev_seq | integer, or null | ||
received_at | string (date-time) | ||
removed_at | string (date-time) | Withdrawals only. | |
record_hash | string | ||
signature | string |
FileReceipt
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | ||
filename | string | ||
content_type | string | ||
size | integer | ||
sha256 | string |
Attachment
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | ||
filename | string | ||
content_type | string | ||
size | integer | ||
sha256 | string | ||
download_url | string | Not signed. |
HistoryItem
| Field | Type | Required | Notes |
|---|---|---|---|
seq | integer | ||
type | string: record, removal | ||
revision | integer | ||
supersedes_seq | integer, or null | ||
received_at | string | ||
record_hash | string |
PublicationState
| Field | Type | Required | Notes |
|---|---|---|---|
authority_record_id | integer | ||
external_id | string | ||
state | string: current, withdrawn, revoked | ||
revoked_by_seq | integer, or null | seq of the status entry that revokes it, if revoked. | |
revision | integer | ||
current_seq | integer | AI Platform keys only. | |
current_revision | integer | AI Platform keys only. | |
current_record_hash | string | AI Platform keys only. | |
authority_record_effective_status | string | AI Platform keys only. | |
history | array of HistoryItem |
AuthorityRecordView
Convenience view of one authority record, for AI Platform keys. The signed status entries in the feed are the authoritative history.
| Field | Type | Required | Notes |
|---|---|---|---|
id | integer | yes | |
effective_status | string: active, suspended, ended, revoked | yes | The stricter of the GovTech Provider's status and the record's own. |
effective_status_source | string: provider, authority_record, both, none | yes | Which level limits the record; none when it is active. |
own_status | string: active, suspended, ended, revoked | yes | |
provider_status | string: active, suspended, revoked | yes | The GovTech Provider's standing; a GovTech Provider that is not yet approved counts as suspended. |
enrolled_at | string (date-time) | yes | |
ended_at | string (date-time), or null | yes | |
provider | object | yes | |
provider.id | integer | yes | |
provider.name | string | yes | |
government | object | yes | |
government.official_id_type | string: census_pid6, nces_leaid, other | yes | |
government.official_id | string | yes | |
government.name | string | yes | |
government.level | string, or null | yes | |
government.state | string, or null | yes | |
government.county | string, or null | yes | |
government.city | string, or null | yes | |
government.unit_type_text | string, or null | yes | |
verification | object | yes | |
verification.identity | object | yes | Aigistry's automatic comparison of the government with the Census or NCES list. |
verification.identity.on_reference_list | boolean | yes | |
verification.identity.reference_source | string, or null | yes | |
verification.identity.listed_as_flagged | boolean | yes | |
verification.identity.enrollment_flagged | boolean | yes | |
verification.identity.enrollment_flag_reason | string, or null | yes | |
verification.identity.flag_review_outcome | string: accepted, concern, or null | yes | |
verification.attestation | object | yes | The GovTech Provider's own statement that it is authorized by this government. It is recorded, not checked. |
verification.attestation.attested | boolean | yes | |
verification.attestation.attested_at | string (date-time), or null | yes | |
verification.attestation.attestation_version | string, or null | yes | |
verification.attestation.provider_agreement_version | string, or null | yes | |
verification.attestation.provider_agreement_on | string (date), or null | yes | |
verification.attestation.checked_by_aigistry | boolean | yes | |
verification.sampling | object | yes | Aigistry's independent sampling: the latest result of each method, and how much of the GovTech Provider's active records has been checked. |
verification.sampling.state | string: not_checked, check_passed, check_failed | yes | |
verification.sampling.last_verified_at | string (date-time), or null | yes | |
verification.sampling.methods | object | yes | |
verification.sampling.methods.census_match | object, or null | yes | |
verification.sampling.methods.callback | object, or null | yes | |
verification.sampling.methods.website_match | object, or null | yes | |
verification.sampling.provider_active_records | integer | yes | |
verification.sampling.provider_active_records_checked | integer | yes |
Authority
| Field | Type | Required | Notes |
|---|---|---|---|
name | string, or null | ||
type | string, or null | ||
state | string, or null | ||
county | string, or null | ||
city | string, or null |
Entry
One signed entry. The signed text is built from the fields listed in VERIFICATION.md (the 14 base fields, attachments, then the chain and status fields that are present). The authority object is the feed's grouping of authority_name, authority_type, state, county and city. Fields download_url, removed_at and the signature fields are not part of the signed text.
| Field | Type | Required | Notes |
|---|---|---|---|
seq | integer | yes | |
type | string: record, removal, status | yes | |
external_id | string, or null | ||
authority | Authority | ||
agency | string, or null | ||
title | string, or null | ||
body | string, or null | ||
source_url | string, or null | ||
published_at | string, or null | ||
received_at | string | ||
attachments | array of Attachment, or null | null when the entry has no attachments. The signed text then leaves the attachments key out. | |
authority_record_id | integer, or null | ||
provider_id | integer, or null | ||
provider_name | string, or null | ||
government_official_id_type | string, or null | ||
government_official_id | string, or null | ||
revision | integer, or null | ||
supersedes_seq | integer, or null | ||
prev_seq | integer, or null | ||
prev_hash | string, or null | ||
status_scope | string: provider, authority_record, publication, or null | ||
status_event | string: suspended, reinstated, ended, revoked, revocation_lifted, or null | ||
reason_class | string, or null | ||
reason_code | string, or null | ||
revoked_from_seq | integer, or null | ||
revoked_through_seq | integer, or null | ||
references_seq | integer, or null | ||
removed_at | string, or null | ||
record_hash | string | yes | pattern ^[a-f0-9]{64}$ |
signature | string | yes | |
signature_algorithm | string: Ed25519 | yes | |
public_key_id | string | yes |
FeedHead
Signed statement of the newest entry. Signed text: {"type":"feed_head","seq":N,"record_hash":"...","signed_at":"..."}; head_hash is its SHA-256; signature is Ed25519 over the head_hash string. Null only on an empty feed.
| Field | Type | Required | Notes |
|---|---|---|---|
seq | integer | ||
record_hash | string | ||
signed_at | string | ||
head_hash | string | ||
signature | string | ||
signature_algorithm | string | ||
public_key_id | string |
FeedPage
| Field | Type | Required | Notes |
|---|---|---|---|
entries | array of Entry | yes | |
next_after | integer | yes | The seq of the last entry returned, or the request cursor if none was returned. |
has_more | boolean | yes | |
filter | object, or null | yes | The filter that was applied: {authority_record_id}, {provider_id} or {official_id_type, official_id}; null when the read was not filtered. Not signed: a verifier must be told by its caller that a read was filtered. |
feed_head | FeedHead | yes | Signed statement of the newest entry. Signed text: {"type":"feed_head","seq":N,"record_hash":"...","signed_at":"..."}; head_hash is its SHA-256; signature is Ed25519 over the head_hash string. Null only on an empty feed. |
PublicKeys
| Field | Type | Required | Notes |
|---|---|---|---|
registry | string | ||
issuer | string | ||
usage | string | ||
keys | array of object | yes | |
keys[].key_id | string | ||
keys[].status | string: active, retired, revoked | ||
keys[].algorithm | string: Ed25519 | ||
keys[].encoding | string: hex | ||
keys[].public_key | string | ||
keys[].revoked_at | string | Revoked keys only. UTC time the notice was made. | |
keys[].compromised_since | string | Revoked keys only. Earliest moment the key may have been in other hands. | |
keys[].last_trusted_seq | integer | Revoked keys only. Entries signed by this key are trusted only up to this seq (0 = none). | |
keys[].last_trusted_hash | string | Revoked keys only. record_hash of that entry (null when last_trusted_seq is 0). | |
keys[].reason | string: key_compromise, suspected_compromise | ||
keys[].notice_signed_by | string | Revoked keys only. key_id of the key that signed the notice. | |
keys[].notice_signature | string | Revoked keys only. Ed25519 signature (hex) over the SHA-256 of the notice text; see VERIFICATION.md. | |
keys[].published_at | string (date-time) | When the key was first listed. | |
keys[].retired_at | string (date-time) | Retired keys only. |
EnrollItem
| Field | Type | Required | Notes |
|---|---|---|---|
official_id_type | string: census_pid6, nces_leaid, other | yes | census_pid6 and nces_leaid must be on the loaded Census or NCES list. other adds an unlisted government with an identifier you supply. |
official_id | string | yes | Text, not a number: keep leading zeros. pattern ^[A-Za-z0-9][A-Za-z0-9._-]{0,39}$ |
name | string | yes | min length 1; max length 200 |
state | string | yes | Two-letter US state or territory code. |
level | string: state, county, city, township, school_district, special_district, other | Optional. A level that differs from the list raises a flag. | |
county | string | max length 120 | |
city | string | max length 120 |
EnrollRequest
Send either records (a batch of 1 to 500) or the fields of one government directly in this object.
| Field | Type | Required | Notes |
|---|---|---|---|
attestation | true | yes | Must be true: you confirm you are authorized to publish for each government listed. |
attestation_version | string | yes | Which version of the attestation wording you are confirming; stored with the enrollment. pattern ^[A-Za-z0-9][A-Za-z0-9 ._-]{0,39}$ |
records | array of EnrollItem | min items 1; max items 500 | |
official_id_type | string: census_pid6, nces_leaid, other | census_pid6 and nces_leaid must be on the loaded Census or NCES list. other adds an unlisted government with an identifier you supply. | |
official_id | string | Text, not a number: keep leading zeros. pattern ^[A-Za-z0-9][A-Za-z0-9._-]{0,39}$ | |
name | string | min length 1; max length 200 | |
state | string | Two-letter US state or territory code. | |
level | string: state, county, city, township, school_district, special_district, other | Optional. A level that differs from the list raises a flag. | |
county | string | max length 120 | |
city | string | max length 120 |
EnrollResult
| Field | Type | Required | Notes |
|---|---|---|---|
index | integer | yes | Position in the batch, from 0. |
result | string: created, already_enrolled, re_enrolled, rejected | yes | re_enrolled: an ended enrollment was made active again (a signed reinstated entry is written). |
reason | string | Rejected items only: why. | |
authority_record_id | integer, or null | yes | |
status | string: active, or null | yes | |
flagged | boolean, or null | yes | |
flag_reason | string: state_mismatch, level_mismatch, name_mismatch, unlisted, non_standard_agency, or null | yes |
EnrollResponse
| Field | Type | Required | Notes |
|---|---|---|---|
results | array of EnrollResult | yes | |
summary | object | yes | |
summary.created | integer | yes | |
summary.already_enrolled | integer | yes | |
summary.re_enrolled | integer | yes | |
summary.rejected | integer | yes |
EnrollmentRecord
A GovTech Provider's own view of one enrollment (an authority record).
| Field | Type | Required | Notes |
|---|---|---|---|
id | integer | yes | |
status | string: active, suspended, ended, revoked | yes | |
flagged | boolean | yes | |
flag_reason | string, or null | yes | |
enrolled_at | string (date-time) | yes | |
ended_at | string (date-time), or null | yes | |
attested_at | string (date-time), or null | yes | |
attestation_version | string, or null | yes | |
verification_state | string: not_checked, check_passed, check_failed | yes | |
government | object | yes | |
government.official_id_type | string | yes | |
government.official_id | string | yes | |
government.name | string | yes | |
government.level | string, or null | yes | |
government.state | string, or null | yes | |
government.county | string, or null | yes | |
government.unit_type_text | string, or null | yes | |
government.listed_as_flagged | boolean | yes | |
government.source | string, or null | yes |
EnrollmentList
| Field | Type | Required | Notes |
|---|---|---|---|
records | array of EnrollmentRecord | yes | |
next_after | integer | yes | The id of the last record returned, or the request cursor if none. |
has_more | boolean | yes |
WhoAmI
| Field | Type | Required | Notes |
|---|---|---|---|
kind | string: provider, platform | yes | |
name | string | yes | |
id | integer | yes | The GovTech Provider's or AI Platform's id. |
key_label | string | yes | The label given to this key. |
HealthDown
| Field | Type | Required | Notes |
|---|---|---|---|
status | "down" | yes | |
problems | array of string: database, signer | yes |
