Ask about notices
const url = 'https://api-staging.fedwright.com/v1/ask';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"filters":{"phases":["open"],"setAsidePrograms":["sdvosb"]},"question":"Which open SDVOSB set-asides for aircraft parts close this month?"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api-staging.fedwright.com/v1/ask \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "filters": { "phases": [ "open" ], "setAsidePrograms": [ "sdvosb" ] }, "question": "Which open SDVOSB set-asides for aircraft parts close this month?" }'Answers one question from the notices Fedwright holds, citing the
notices each part of the answer comes from. Each ask stands
alone: nothing from an earlier ask is used. As in searchNotices,
only open opportunity notices that aren’t archived are searched by
default; filters and includeHistory narrow or widen that, and
noticeIds or threadId limit the ask to those notices.
When Accept names text/event-stream, the answer streams as
server-sent events while it is written. Any other Accept, */* or
none included, gets it once, as one JSON AskAnswer with the same
content. A stream sends:
retrieval, first: the notices the answer may draw on, and what semantic search did. It comes before any text is written.- For each claim (a sentence of the answer, in order), a
textevent with its text, then acitationevent for each passage that supports it. Text arrives a whole claim at a time. done, last: the answer’s ID, itsstatus, and its token usage.
Each event’s data is one line of JSON, as AskEvent describes by
event name. A comment line (: keep-alive) is sent every 15 seconds
while nothing else is. Once the stream has started its status can’t
change, so a later failure is an error event (Problem Details)
followed by done with status: error.
Refusals come before the stream starts, as ordinary Problem Details:
the organization’s AI spending budget (429 ai-budget-exceeded),
its premium units for the day (429 premium-quota-exceeded; an ask
uses ten), the rate limits (429 rate-limited), the AI provider (503
ai-unavailable), and search readiness for the ask’s scope (503
search-unavailable).
The answer and cited text are plain text, never Markdown or HTML:
render them as text. An ask may take up to 90 seconds in all, not
the 10 seconds other operations have. It creates nothing, so it takes
no Idempotency-Key.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”One question, and where to look for its answer. Name at most one of
noticeIds and threadId. Unknown properties are rejected.
object
Every filter is optional. Values within one filter are alternatives (OR); different filters must all hold (AND). Free-text array items cannot contain backslashes or control characters.
object
When true, include only forecast, presolicitation, and solicitation
notices whose current response deadline is after the search time or
missing. False or absent applies no filter. Unlike the open phase,
this includes Sources Sought and Special Notices in forecast and
notices in presolicitation. A date-only deadline ends at midnight
after its date in US Eastern time.
Include only notices whose award amount is at most this amount, as a decimal string.
Include only notices whose award amount is at least this amount, as a decimal string.
Enrichment conditions.
Include only notices whose response deadline is at or after this time.
Include only notices whose response deadline is at or before this time.
Department keys.
Include only notices Fedwright first saw at or after this time. Using this filter leaves out historical notices.
Enrichment labels.
NAICS codes at any level, including range sectors such as 31-33. Older-edition codes match their current equivalents.
Include only notices of these types.
Phase is the notice’s stage: Sources Sought and Special Notices are forecast; open and closed apply only to solicitations and use the deadline at the time of the search. Use acceptingResponses to find notices that can still receive a response. archived requires includeHistory: true.
Include only notices whose place of performance is in one of these countries.
Include only notices whose place of performance is in one of these states or territories, by USPS code.
Include only notices SAM.gov posted at or after this time.
Include only notices SAM.gov posted at or before this time.
PSC codes at any level, for example 61, 6145, R, R4, or R499.
Include only notices with one of these SAM.gov set-aside codes.
Include only notices whose set-aside belongs to one of these programs.
When true, include only sole-source notices. When false, include only notices that are not sole-source.
Include only notices from these sub-tier agencies, by the name SAM.gov gives.
Opaque thread identifier; use the ID the API returns.
Also search award notices, justifications, and archived notices, as searchNotices does.
Answer from these notices only, such as when asking from a notice’s page.
The question, in plain language.
Answer from this thread’s notices only.
Responses
Section titled “Responses”The answer: server-sent events when the request accepts
text/event-stream, otherwise one JSON body. Either way it is
sent with Cache-Control: no-store.
A whole answer, the JSON form of an ask: the stream’s content in one
body. text is plain text, the claims in order; each citation’s
claim counts the answer’s claims from 0. grounded is false when
the answer has text but no valid citation.
object
A UUIDv7.
The notice passages that support the answer’s claims, in answer order.
A notice passage that supports one claim of the answer. citedText
is the passage as the notice has it, word for word, in plain text.
Only citations Fedwright found in the notice’s text are sent.
object
The supporting passage, word for word as the notice has it, in plain text.
The claim the passage supports, counted from 0 in answer order.
The notice’s page.
SAM.gov NoticeId.
Opaque thread identifier; use the ID the API returns.
The notice’s title.
Which notices the ask’s scope includes. full when it includes only
fully covered notices: notices whose whole text is indexed in
passages for search by meaning. limited when it also includes
notices that aren’t, such as archived notices, historical notices,
and very long descriptions: their passages are found only when they
share the question’s words, and may be missed when they say it
another way. Coverage doesn’t say what ran for this ask: when the
question can’t be searched by meaning, coverage stays full and
semantic says why.
False when the answer has text but no valid citation.
The notices the answer may draw on, in the order they were found.
A notice the answer may draw on.
object
Which notices the ask’s scope includes. full when it includes only
fully covered notices: notices whose whole text is indexed in
passages for search by meaning. limited when it also includes
notices that aren’t, such as archived notices, historical notices,
and very long descriptions: their passages are found only when they
share the question’s words, and may be missed when they say it
another way. Coverage doesn’t say what ran for this ask: when the
question can’t be searched by meaning, coverage stays full and
semantic says why.
The notice’s page.
SAM.gov NoticeId.
Opaque thread identifier; use the ID the API returns.
The notice’s title.
What semantic search did for a request. Semantic ranking is best
effort: when it can’t run, results come from ranking by words alone,
and reason says why. It covers only the notices indexed for it.
When applied, model is an opaque version of the ranking, ratio is above 0, and
reason is null; otherwise model is null, ratio is 0, and
reason says why.
object
Whether the results were ranked by meaning as well as by words (a hybrid query).
When applied, an opaque version of the semantic ranking used for these results; otherwise null. Compare it, don’t parse it. It changes when the ranking changes.
The semantic ratio that ran, 0 when not applied.
Null when applied. Otherwise why not:
capped: the caller’s or Fedwright’s limit for semantic queries is used up for now.disabled: semantic search is off in this environment.embeddingTimeout: the query couldn’t be prepared in time.embeddingUnavailable: the AI provider that prepares queries is unavailable.emptyQuery: there is no text to rank by meaning.modelMismatch: semantic ranking was unavailable for this query, so it ran by words.notRequested: the ratio is 0.premiumQuota: the organization’s premium units for the day can’t cover a semantic search, or its plan has none, so the query ran by words. It is not an error.semanticSearchUnavailable: the hybrid query failed, so the query ran again by words.
How the answer ended:
complete: the answer is whole.error: it failed; the stream’serrorevent says why.noEvidence: no notice in the ask’s scope matched, or the model found no answer in the notices that did, so no answer was written.coveragesays what that covers.refused: the model declined to answer, so any text already sent is not an answer.truncated: the answer reached its length limit, so it is incomplete.
The answer, as plain text. Empty for noEvidence.
The tokens the answer used, as the AI provider reported them.
object
The input tokens the AI provider served from its cache.
The input tokens the AI provider reported for the request.
The tokens the AI provider generated for the answer.
Examples
An ask answer
{ "answerId": "019aa3f2-6d10-7b20-9c4f-7e2d3cad5b12", "citations": [ { "citedText": "15--STEP ASSY", "claim": 0, "link": "https://sam.gov/opp/e6a41be9630d4261b6f3131923fdc4ce/view", "noticeId": "e6a41be9630d4261b6f3131923fdc4ce", "threadId": "DEPTOFDEFENSE:N0038326QFC09", "title": "15--STEP ASSY" } ], "coverage": "full", "grounded": true, "notices": [ { "coverage": "full", "link": "https://sam.gov/opp/e6a41be9630d4261b6f3131923fdc4ce/view", "noticeId": "e6a41be9630d4261b6f3131923fdc4ce", "threadId": "DEPTOFDEFENSE:N0038326QFC09", "title": "15--STEP ASSY" } ], "semantic": { "applied": true, "model": "model-version-1", "ratio": 0.5, "reason": null }, "status": "complete", "text": "The Navy is buying a step assembly (PSC 1560), with offers due November 2, 2026.", "usage": { "cacheReadTokens": 0, "inputTokens": 5210, "outputTokens": 184 }}A citation, sent after the text of the claim it supports.
object
A notice passage that supports one claim of the answer. citedText
is the passage as the notice has it, word for word, in plain text.
Only citations Fedwright found in the notice’s text are sent.
object
The supporting passage, word for word as the notice has it, in plain text.
The claim the passage supports, counted from 0 in answer order.
The notice’s page.
SAM.gov NoticeId.
Opaque thread identifier; use the ID the API returns.
The notice’s title.
The event name, always citation.
The last event, with how the answer ended.
object
How the answer ended: its identifier, coverage, status, and token usage.
object
A UUIDv7.
Which notices the ask’s scope includes. full when it includes only
fully covered notices: notices whose whole text is indexed in
passages for search by meaning. limited when it also includes
notices that aren’t, such as archived notices, historical notices,
and very long descriptions: their passages are found only when they
share the question’s words, and may be missed when they say it
another way. Coverage doesn’t say what ran for this ask: when the
question can’t be searched by meaning, coverage stays full and
semantic says why.
False when the answer has text but no valid citation.
How the answer ended:
complete: the answer is whole.error: it failed; the stream’serrorevent says why.noEvidence: no notice in the ask’s scope matched, or the model found no answer in the notices that did, so no answer was written.coveragesays what that covers.refused: the model declined to answer, so any text already sent is not an answer.truncated: the answer reached its length limit, so it is incomplete.
The tokens the answer used, as the AI provider reported them.
object
The input tokens the AI provider served from its cache.
The input tokens the AI provider reported for the request.
The tokens the AI provider generated for the answer.
The event name, always done.
A failure after the stream started, such as ai-unavailable or
ai-budget-exceeded when a retry couldn’t run. done with status: error follows.
object
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.
The event name, always error.
The first event, sent before any text is written.
object
The identifier of the answer, the coverage of the search, and the notices the answer may draw on.
object
A UUIDv7.
Which notices the ask’s scope includes. full when it includes only
fully covered notices: notices whose whole text is indexed in
passages for search by meaning. limited when it also includes
notices that aren’t, such as archived notices, historical notices,
and very long descriptions: their passages are found only when they
share the question’s words, and may be missed when they say it
another way. Coverage doesn’t say what ran for this ask: when the
question can’t be searched by meaning, coverage stays full and
semantic says why.
The notices the answer may draw on, in the order they were found.
A notice the answer may draw on.
object
Which notices the ask’s scope includes. full when it includes only
fully covered notices: notices whose whole text is indexed in
passages for search by meaning. limited when it also includes
notices that aren’t, such as archived notices, historical notices,
and very long descriptions: their passages are found only when they
share the question’s words, and may be missed when they say it
another way. Coverage doesn’t say what ran for this ask: when the
question can’t be searched by meaning, coverage stays full and
semantic says why.
The notice’s page.
SAM.gov NoticeId.
Opaque thread identifier; use the ID the API returns.
The notice’s title.
What semantic search did for a request. Semantic ranking is best
effort: when it can’t run, results come from ranking by words alone,
and reason says why. It covers only the notices indexed for it.
When applied, model is an opaque version of the ranking, ratio is above 0, and
reason is null; otherwise model is null, ratio is 0, and
reason says why.
object
Whether the results were ranked by meaning as well as by words (a hybrid query).
When applied, an opaque version of the semantic ranking used for these results; otherwise null. Compare it, don’t parse it. It changes when the ranking changes.
The semantic ratio that ran, 0 when not applied.
Null when applied. Otherwise why not:
capped: the caller’s or Fedwright’s limit for semantic queries is used up for now.disabled: semantic search is off in this environment.embeddingTimeout: the query couldn’t be prepared in time.embeddingUnavailable: the AI provider that prepares queries is unavailable.emptyQuery: there is no text to rank by meaning.modelMismatch: semantic ranking was unavailable for this query, so it ran by words.notRequested: the ratio is 0.premiumQuota: the organization’s premium units for the day can’t cover a semantic search, or its plan has none, so the query ran by words. It is not an error.semanticSearchUnavailable: the hybrid query failed, so the query ran again by words.
The event name, always retrieval.
The text of the answer’s next claim, as plain text.
object
The next claim of the answer and its position.
object
The claim, counted from 0 in answer order.
The claim’s text.
The event name, always text.
The request is malformed, or its schema refuses it: an unknown
property, a value of the wrong type or outside its bounds, a limit
above 200, or a sort outside the operation’s allow-list (Problem
type bad-request). errors names each field by its path, such as
nested.note, or $ for the body itself. The request is refused
before anything is read or written. A cursor that was altered, has
expired, or was issued for other filters, another sort, organization,
or user returns Problem type invalid-cursor.
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 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 request is well formed and its schema accepts it, but it breaks a
rule beyond the schema, such as an unknown NAICS code (Problem type
validation-failed, with errors by field path). An
Idempotency-Key already used for another request returns
idempotency-key-reused.
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.
The ask can’t run now, and nothing was charged. The AI provider is
unavailable, or Fedwright’s own AI capacity is used up for now
(Problem type ai-unavailable); or the search indexes the ask’s
scope needs aren’t ready (search-unavailable). Retry after the
indicated number of seconds.
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"}Headers
Section titled “Headers”Seconds to wait before retrying.
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"}