Get a notice
const url = 'https://api-staging.fedwright.com/v1/notices/e6a41be9630d4261b6f3131923fdc4ce';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api-staging.fedwright.com/v1/notices/e6a41be9630d4261b6f3131923fdc4ce \ --header 'Authorization: Bearer <token>'The current version of a notice. Fields that come from AI enrichment are under enrichment.
Data source: SAM.gov contract opportunities.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”SAM.gov NoticeId.
SAM.gov NoticeId.
Header Parameters
Section titled “Header Parameters”The ETag the client holds. A match returns 304.
Responses
Section titled “Responses”The notice.
A SAM.gov notice, normalized. Raw values are kept where normalization loses information.
object
The agency fields of a notice, as SAM.gov gives them, with the department also reduced to a matching key.
object
The activity address code (AAC) that identifies the contracting office. Null when the notice has none.
The department’s three-digit CGAC (Common Government-wide Accounting Classification) code. Null when the notice has none.
The department as SAM.gov names it. Null for the rows with no agency.
The department name uppercased, letters and digits only.
The FPDS (Federal Procurement Data System) code of the contracting office. Null when the notice has none.
The contracting office’s name, as SAM.gov gives it. Null when the notice has none.
The type of organization SAM.gov records for the issuing office, such as OFFICE. Null when the notice has none.
The sub-tier agency’s name, as SAM.gov gives it. Null when the notice has none.
SAM.gov’s archive policy for the notice.
object
The date SAM.gov archives the notice. Null when SAM.gov gives none.
SAM.gov’s archive type for the notice, such as auto15. Null when SAM.gov gives none.
Award fields as the notice carries them. Award notices also produce an Award.
object
The awardee’s name as the notice gives it, or null when it gives none.
The award date the notice states, or null when it states none.
Null when the notice has other award fields but no award number.
SAM.gov notice type, using its published label.
The notice’s points of contact, at most two.
A point of contact for a notice, as SAM.gov lists it.
object
The contact’s email address. Null when the notice gives none.
The contact’s fax number. Null when the notice gives none.
The contact’s name. Null when the notice gives none.
The contact’s phone number. Null when the notice gives none.
Whether the contact is the notice’s primary or its secondary point of contact.
The contact’s job title. Null when the notice gives none.
SHA-256 of the normalized notice.
Plain text, with HTML entities decoded (hadEntities) and whitespace
tidied. Text in angle brackets, such as <https://...> or
<Company Name>, is kept. SAM.gov cuts descriptions off at about
32,000 characters (truncated).
object
A description formatted as Markdown. Only core CommonMark paragraphs, headings, bold field
labels, and lists to depth 5 appear, and each list item keeps its source label as an escaped
prefix, such as \(1\). Render it with a sanitizing CommonMark renderer that treats links,
images, raw HTML, and code as literal text, with one exception (2026-10-27): an ordered list
whose source numbered it with letters or Roman numerals (a), (iv)) is preceded by a line
holding exactly the comment <!-- fedwright:list style=lower-alpha delimiter=period -->
(style: lower-alpha, upper-alpha, lower-roman, upper-roman; delimiter: period,
paren, parens), and the list is numbered 1. 2. 3.. A client shows the letters the style
names (CSS list-style-type) and never shows the comment as text; one that ignores it still
shows a correct numbered list. <!-- fedwright:list style=decimal --> only ends a lettered list
directly above a numbered one. Any other comment or HTML is literal text.
object
An opaque identifier of the prompt, script schema, and renderer that formatted it.
The description formatted as Markdown.
The text had HTML entities, such as ', which were decoded.
The length of text in characters.
The notice’s description as plain text.
True when SAM.gov cut the description off, so text is incomplete.
The current AI output, separate from SAM.gov fields; evidence quotes include the cited text.
object
What the notice text says about an amendment.
object
True when the text signals that the solicitation may be canceled.
The quotes from the notice that support this amendment finding.
A quote from the notice that supports an enriched value.
object
The quoted text.
The notice field the quote comes from, such as description.
The amendment number the text states, or null when it states none.
Conditions on eligibility that the notice states, such as set-aside restrictions.
A condition on eligibility that the notice states.
object
The quotes from the notice that support the condition.
A quote from the notice that supports an enriched value.
object
The quoted text.
The notice field the quote comes from, such as description.
The condition, taken from a fixed list. other means a condition that is not on the list.
A short statement of the condition when id is other, otherwise null.
How confident the enrichment is in each of its sections.
object
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
How confident the enrichment is in a section: high, medium, or low.
Points of contact stated in the notice text.
A point of contact stated in the notice text.
object
The contact’s email address, or null when the text states none.
The contact’s name, or null when the text states none.
The contact’s phone number, or null when the text states none.
The contact’s role as the text states it, or null when it states none.
The contract type as the notice states it, for example firm-fixed-price, or null when it does not state one.
When this enrichment was produced.
The identifier of this enrichment.
An estimated value of the work, as the notice states it.
object
The currency of the amounts, as a three-letter ISO 4217 code.
The upper bound of the stated value as a decimal string, or null when the notice states no upper bound.
The lower bound of the stated value as a decimal string, or null when the notice states no lower bound.
How the notice words the value.
Dates the notice states, such as when responses or questions are due.
A date the notice states.
object
The date.
The quotes from the notice that support the date.
A quote from the notice that supports an enriched value.
object
The quoted text.
The notice field the quote comes from, such as description.
The role a date plays in responding to the notice: responses_due, questions_due, site_visit, award_expected, or other.
The time of day the text states, or null when it states none.
The time zone the text states, or null when it states none.
Topic labels for the notice, taken from a fixed list.
What a responder must have or meet, such as a registration, qualification, or clearance.
A qualification or registration a responder needs.
object
The quotes from the notice that support the requirement.
A quote from the notice that supports an enriched value.
object
The quoted text.
The notice field the quote comes from, such as description.
The category of a requirement: registration, qualification, clearance, or other.
The requirement in plain language.
What a responder must do, in the order the notice gives.
A step a responder must take.
object
The quotes from the notice that support the step.
A quote from the notice that supports an enriched value.
object
The quoted text.
The notice field the quote comes from, such as description.
The step’s position in the order the notice gives, starting at 1.
The step in plain language.
A short plain-language summary of the notice.
SAM.gov NoticeId.
Links to the notice on SAM.gov.
object
The public SAM.gov page.
SAM.gov’s Link, which needs a SAM.gov login.
The caller organization’s match details.
object
The NAICS code as given, with every prefix, including the range
sectors (31-33, 44-45, 48-49). Filters and matching use
matchCodes, which adds the current-edition equivalents of codes from
older editions.
object
The NAICS code as SAM.gov gave it, 2 to 6 digits.
For a code from an older edition, its current-edition codes.
The NAICS edition the code comes from. Null when the code isn’t in any edition.
The codes that filters and matching compare against: the code’s prefixes plus the current-edition equivalents of a code from an older edition.
Every prefix of the code, from the 2-digit sector to the code itself. A sector that spans a range uses the range, such as 31-33.
The code exists in the master list, in some edition.
The contracting office’s address, which isn’t the place of performance.
object
The city, or null when SAM.gov gave none.
The country, or null when SAM.gov gave none.
The state or territory, or null when SAM.gov gave none.
The postal code, or null when SAM.gov gave none.
Where the work is to be performed, as the notice gives it.
object
The city, or null when the notice gives none.
ISO 3166-1 alpha-3, as the extract gives it.
USPS state or territory code.
The street address, or null when the notice gives none.
The postal code, or null when the notice gives none.
SAM.gov’s PostedDate. The extract gives no time zone, and it changes
between extracts, so tz is the zone that ingestion detected, or
assumed when tzAssumed is true.
object
The time SAM.gov posted the notice.
The value as SAM.gov gave it.
The time zone the posted time was read in: UTC or America/New_York (US Eastern).
True when SAM.gov gave no time zone and tz is an assumption.
The product or service code as given, with its hierarchy.
object
The PSC code, normalized.
Whether the code is for a product, a service, or rd (research and development), or null when the kind could not be determined.
Every level the code identifies, for filters: P:15 is product group 15, S:R4 is service subcategory R4.
The code as SAM.gov gave it.
True when the code has been retired from the PSC list.
The code exists in the PSC master list, including retired codes.
at when the deadline has a time; date when SAM.gov gave only a
date, which counts as the end of that day in US Eastern time.
object
The deadline as a point in time, or null when SAM.gov gave a date without a time.
The deadline’s date, or null when SAM.gov gave a time as well.
True when SAM.gov gave a time as well as a date.
The deadline exactly as SAM.gov gave it.
True when SAM.gov gave a time without an offset, read as US Eastern.
state is set for a set-aside code, none_stated when SAM.gov said
NONE, and missing when the field was empty.
object
The SAM.gov set-aside code, or null when none is set.
The set-aside’s name, or null when none is set.
The set-aside programs the code belongs to. Empty when none is set.
The value as given, for example ["SBA"].
True when the set-aside is a sole-source code.
set when the notice has a set-aside code, none_stated when SAM.gov said NONE, and missing when the field was empty.
Where the notice came from, one entry per upstream record. Absent when source provenance is not yet available.
An upstream record that contributed to a record.
object
When this publisher first delivered the record.
The version of the publisher’s format Fedwright read the record with.
When this publisher last delivered the record.
A source identifier, such as grantsgov.extract, for the kind of data the record came from.
The publisher, such as grantsgov; derived for a record Fedwright derived.
The publisher’s own identifier for the record, verbatim.
A link to the record at the publisher, or null when there is none.
firstSeenAt and lastSeenAt are when Fedwright first and last saw
the notice in an extract. A notice that leaves the extract is archived,
never deleted.
object
True while the notice is current, meaning it is in SAM.gov’s published data now. False when it is not current, such as a notice from the historical archive or one that is no longer published.
When the notice was archived, or null while it is active.
When Fedwright first saw the notice.
When Fedwright last saw the notice.
Opaque thread identifier; use the ID the API returns.
The first 50 events in the notice’s thread, oldest first.
One event in a thread’s history.
object
When the event happened.
What happened: the thread was created, a notice was amended, corrected (changed in place), awarded, or justified as sole source (sole_source_justified), or the thread was archived.
SAM.gov NoticeId.
The version of the notice the event concerns.
True when the thread has more than 50 events and timeline shows only the first 50.
The notice’s title.
SAM.gov notice type, using its published label.
1 when first seen. Each in-place change adds 1.
Examples
A notice
{ "agency": { "aacCode": "N00383", "cgac": "017", "department": "DEPT OF DEFENSE", "departmentKey": "DEPTOFDEFENSE", "fpdsCode": "1700", "office": "NAVSUP WEAPON SYSTEMS SUPPORT", "organizationType": "OFFICE", "subTier": "DEPT OF THE NAVY" }, "archive": { "date": "2026-11-17", "type": "auto15" }, "award": null, "baseType": "Solicitation", "contacts": [ { "email": "contact26@example.com", "fax": null, "name": "Contact Person 76", "phone": null, "role": "primary", "title": null } ], "contentHash": "74ded46d58333c9b707e799737807c47822dad5afbdd4bc5c6d6497ec0e76d22", "description": { "hadEntities": false, "length": 1331, "text": "CONTACT INFORMATION|4|N732.76|N00383|555-0159|contact26@example.com| WIDE AREA WORKFLOW PAYMENT INSTRUCTIONS (JAN 2023)|16|Invoice and Receiving Report (Combo)||TBD|N00383|TBD|TBD|See schedule|TBD|See schedule|||||||| This is for an FMS spares requirement. All terms and ...", "truncated": false }, "enrichment": null, "id": "e6a41be9630d4261b6f3131923fdc4ce", "links": { "public": "https://sam.gov/opp/e6a41be9630d4261b6f3131923fdc4ce/view", "sourceWorkspace": "https://sam.gov/workspace/contract/opp/e6a41be9630d4261b6f3131923fdc4ce/view" }, "naics": { "code": "336413", "currentEquivalents": [], "edition": "2022", "matchCodes": [ "33", "31-33", "336", "3364", "33641", "336413" ], "prefixes": [ "33", "31-33", "336", "3364", "33641", "336413" ], "valid": true }, "officeAddress": { "city": "PHILADELPHIA", "country": "USA", "state": "PA", "zip": "19111-5098" }, "placeOfPerformance": null, "posted": { "at": "2026-10-02T10:25:59Z", "raw": "2026-10-02 06:25:59", "tz": "America/New_York", "tzAssumed": false }, "psc": { "code": "1560", "kind": "product", "levels": [ "P", "P:15", "P:1560" ], "raw": "1560", "retired": false, "valid": true }, "responseDeadline": { "at": "2026-11-02T20:30:00Z", "date": null, "hasTime": true, "raw": "2026-11-02T16:30:00-04:00", "tzAssumed": false }, "setAside": { "code": null, "label": null, "programs": [], "raw": "", "soleSource": false, "state": "missing" }, "solicitationNumber": { "key": "N0038326QFC09", "raw": "N0038326QFC09" }, "status": { "active": true, "archivedAt": null, "firstSeenAt": "2026-10-03T03:41:12Z", "lastSeenAt": "2026-10-03T03:41:12Z" }, "threadId": "DEPTOFDEFENSE:N0038326QFC09", "title": "15--STEP ASSY", "type": "Solicitation", "version": 1}Headers
Section titled “Headers”Strong entity tag of the returned resource.
The resource has not changed since the ETag in If-None-Match.
Headers
Section titled “Headers”Strong entity tag of the returned resource.
The access token is missing, expired, or invalid.
RFC 9457 Problem Details.
object
An explanation specific to this occurrence of the problem. It is absent for server errors.
Validation errors, by field path.
object
A URI reference that identifies this occurrence of the problem, when the API provides one.
On rate-limited, the quota that is used up, such as org-day. On premium-quota-exceeded, org-premium-day. A 429 with an empty body does not name it.
On rate-limited from the API and on premium-quota-exceeded, when that quota starts again.
The HTTP status code of the response, from 400 to 599.
A short, human-readable summary of the problem. Use type to identify the kind of problem, not this text.
W3C trace ID of the failed request.
https://fedwright.com/problems/{code}, the same in every environment.
Example generated
{ "detail": "example", "errors": { "additionalProperty": [ "example" ] }, "instance": "example", "limit": "example", "resetsAt": "2026-04-15T12:00:00Z", "status": 1, "title": "example", "traceId": "example", "type": "https://example.com"}The Problem type says which check refused the caller, when that is
about the caller’s own token, client, or role:
insufficient-scope when the token’s scopes (or an MCP grant’s) lack
the operation’s scope, with WWW-Authenticate: Bearer error="insufficient_scope", scope="..." (RFC 6750) naming the missing
scopes; client-not-allowed when the operation doesn’t admit the
caller’s kind of client, such as a machine client calling a user-only
operation; and insufficient-role when a confirmed member’s roles
don’t allow the action. Any other refusal is the generic forbidden,
which says nothing more. Another organization’s resource is 404
(not-found) instead, so no reason confirms that it exists. An owner
or administrator who sent no proof of a second factor gets
mfa-required. An operation
that needs an active subscription, when the organization has none,
returns subscription-inactive, or organization-suspended when
Fedwright suspended the organization. A suspended
organization also refuses invitations, new joins through an
invitation, and role changes with organization-suspended. Creating
or joining
an organization without a verified email returns email-unverified,
and accepting an invitation sent to another address returns
invitation-email-mismatch. A request from Fedwright’s web or mobile
app whose session acts for no organization yet returns
organization-required, except on getMe, createOrganization, and
acceptInvitation. Shared data needs the acting organization’s own
subscription; another organization’s doesn’t count.
RFC 9457 Problem Details.
object
An explanation specific to this occurrence of the problem. It is absent for server errors.
Validation errors, by field path.
object
A URI reference that identifies this occurrence of the problem, when the API provides one.
On rate-limited, the quota that is used up, such as org-day. On premium-quota-exceeded, org-premium-day. A 429 with an empty body does not name it.
On rate-limited from the API and on premium-quota-exceeded, when that quota starts again.
The HTTP status code of the response, from 400 to 599.
A short, human-readable summary of the problem. Use type to identify the kind of problem, not this text.
W3C trace ID of the failed request.
https://fedwright.com/problems/{code}, the same in every environment.
Example generated
{ "detail": "example", "errors": { "additionalProperty": [ "example" ] }, "instance": "example", "limit": "example", "resetsAt": "2026-04-15T12:00:00Z", "status": 1, "title": "example", "traceId": "example", "type": "https://example.com"}The resource does not exist, or belongs to another organization.
RFC 9457 Problem Details.
object
An explanation specific to this occurrence of the problem. It is absent for server errors.
Validation errors, by field path.
object
A URI reference that identifies this occurrence of the problem, when the API provides one.
On rate-limited, the quota that is used up, such as org-day. On premium-quota-exceeded, org-premium-day. A 429 with an empty body does not name it.
On rate-limited from the API and on premium-quota-exceeded, when that quota starts again.
The HTTP status code of the response, from 400 to 599.
A short, human-readable summary of the problem. Use type to identify the kind of problem, not this text.
W3C trace ID of the failed request.
https://fedwright.com/problems/{code}, the same in every environment.
Example generated
{ "detail": "example", "errors": { "additionalProperty": [ "example" ] }, "instance": "example", "limit": "example", "resetsAt": "2026-04-15T12:00:00Z", "status": 1, "title": "example", "traceId": "example", "type": "https://example.com"}A rate limit is used up. Direct API access counts against the
organization’s burst, daily, and monthly quotas, which all its machine
clients share; there is no client quota. A 429 comes in two shapes
with two header families, so read the response by what it carries.
A machine client’s calls can get a 429 with an empty body. It
has three headers: X-RateLimit-Limit, the
exhausted rule’s limit and window, such as 3000, 3000;w=2592000;
X-RateLimit-Remaining, what is left in that window (0 on a 429);
and X-RateLimit-Reset, the seconds until that window resets. It has
no Retry-After, no RateLimit headers, no Problem, and does not
name the quota. Read the quota from the window w:
w (seconds) |
Quota |
|---|---|
| 60 | Burst. |
| 86400 | Daily. |
| 2592000 | Monthly (the calendar month is reported as 30 days; X-RateLimit-Reset is exact). |
Wait X-RateLimit-Reset seconds before you retry. Refused requests
still count: a client that keeps calling after a 429 keeps adding to
the counter, so it does not regain budget inside the window. A tier
change takes effect within 10 minutes (checkout, the billing portal,
and grants alike), once the client gets a new access token.
Every other 429 has a Problem and Retry-After. The Problem type
is rate-limited for a used-up quota, or, for an ask, ai-budget-exceeded
or premium-quota-exceeded (below). On rate-limited, Retry-After is
the seconds until the used-up limit’s window resets, the latest if
several are. The Problem also carries limit, the quota that is used
up (the one that resets last, if several are), resetsAt, when it
starts again, and traceId. RateLimit-Policy and RateLimit describe only the
caller’s own limits, here and on every other response a limit applies
to. A request refused with rate-limited uses no quota. One
refused after that check, for its scope, role, subscription, or kind of
client, still counts, so once a quota is used up such a request gets
429 instead of its 403. A request that fails authentication is
not counted. An ask that the organization’s
AI spending budget can’t cover returns ai-budget-exceeded instead,
with Retry-After at the end of the budget’s window: that budget
counts what asks cost, not how many there are. An ask that the
organization’s premium units for the day can’t cover returns
premium-quota-exceeded, with limit (org-premium-day), resetsAt
(the next midnight UTC), and Retry-After. That is the plan’s
allowance: a plan with no premium units never covers an ask, and a
higher plan may. A refused ask uses no units.
RFC 9457 Problem Details.
object
An explanation specific to this occurrence of the problem. It is absent for server errors.
Validation errors, by field path.
object
A URI reference that identifies this occurrence of the problem, when the API provides one.
On rate-limited, the quota that is used up, such as org-day. On premium-quota-exceeded, org-premium-day. A 429 with an empty body does not name it.
On rate-limited from the API and on premium-quota-exceeded, when that quota starts again.
The HTTP status code of the response, from 400 to 599.
A short, human-readable summary of the problem. Use type to identify the kind of problem, not this text.
W3C trace ID of the failed request.
https://fedwright.com/problems/{code}, the same in every environment.
Examples
An ask the premium units can't cover
{ "limit": "org-premium-day", "resetsAt": "2026-11-08T00:00:00Z", "status": 429, "title": "Too Many Requests", "traceId": "4bf92f3577b34da6a3ce929d0e0e4736", "type": "https://fedwright.com/problems/premium-quota-exceeded"}A quota used up
{ "limit": "org-day", "resetsAt": "2026-11-08T00:00:00Z", "status": 429, "title": "Too Many Requests", "traceId": "4bf92f3577b34da6a3ce929d0e0e4736", "type": "https://fedwright.com/problems/rate-limited"}Headers
Section titled “Headers”For each limit in RateLimit-Policy, the requests r its window still
allows and the seconds t until the window resets, such as
"org-burst";r=7;t=40, "org-day";r=62;t=41000.
The caller’s rate limits, in the IETF HTTPAPI RateLimit header fields:
each limit’s name, its quota q, and its window w in seconds, such as
"org-burst";q=20;w=60, "org-day";q=100;w=86400.
Seconds to wait before retrying.
On a 429 with an empty body (and on the successful responses that carry
these headers), the exhausted rule’s limit and window w in seconds,
such as 3000, 3000;w=2592000. The window names the quota: 60 is burst,
86400 is daily, and 2592000 is monthly.
What is left in that rule’s window (0 on a 429).
Seconds until that rule’s window resets.
default
Section titled “default”Any other error. A request body over 64 KiB returns 413
(payload-too-large), and a request that takes longer than 10 seconds
(90 for askOpportunities) returns 503 (request-timeout). An invitation when the API can’t send mail returns 503
(mail-unavailable), and creates nothing. An unexpected failure returns 500 (internal-error)
with only type, title, status, and traceId.
RFC 9457 Problem Details.
object
An explanation specific to this occurrence of the problem. It is absent for server errors.
Validation errors, by field path.
object
A URI reference that identifies this occurrence of the problem, when the API provides one.
On rate-limited, the quota that is used up, such as org-day. On premium-quota-exceeded, org-premium-day. A 429 with an empty body does not name it.
On rate-limited from the API and on premium-quota-exceeded, when that quota starts again.
The HTTP status code of the response, from 400 to 599.
A short, human-readable summary of the problem. Use type to identify the kind of problem, not this text.
W3C trace ID of the failed request.
https://fedwright.com/problems/{code}, the same in every environment.
Example generated
{ "detail": "example", "errors": { "additionalProperty": [ "example" ] }, "instance": "example", "limit": "example", "resetsAt": "2026-04-15T12:00:00Z", "status": 1, "title": "example", "traceId": "example", "type": "https://example.com"}