@opusdns/api 0.84.0 → 0.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/helpers/constants.ts +51 -1
- package/src/helpers/requests.d.ts +1 -1
- package/src/helpers/responses.d.ts +1 -1
- package/src/helpers/schemas.d.ts +16 -0
- package/src/openapi.yaml +283 -146
- package/src/schema.d.ts +15 -3
package/package.json
CHANGED
package/src/helpers/constants.ts
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { AllocationMethodType, AttributeType, BillingTransactionAction, BillingTransactionProductType, BillingTransactionSortField, BillingTransactionStatus, ContactRoleType, ContactSortField, Currency, DeletePolicyType, DnsChangeAction, DnsRrsetType, DnssecAlgorithm, DnssecDigestType, DnssecModeType, DnssecRecordType, DnssecStatus, DomainAttributeKey, DomainAvailabilityStatus, DomainClientStatus, DomainContactType, DomainSortField, DomainStatus, EmailVerificationStatus, EventObjectType, EventSubtype, EventType, GrantType, LaunchPhaseType, LocalPresenceRequirementType, OrganizationStatus, PatchOp, PeriodUnit, Permission, PostTransferRequirements, PostalAddressType, PremiumAffectsType, PremiumSourceType, RegistrantChangeType, RegistryHandleAttributeType, Relation, RenewalMode, ReservedSourceType, SortOrder, SyncOperationType, TLDType, TransferAckType, UserStatus, VerificationType, ZoneSortField } from './schemas';
|
|
24
|
+
import { AllocationMethodType, AttributeType, BillingTransactionAction, BillingTransactionProductType, BillingTransactionSortField, BillingTransactionStatus, ContactRoleType, ContactSortField, Currency, DeletePolicyType, DnsChangeAction, DnsRrsetType, DnssecAlgorithm, DnssecDigestType, DnssecModeType, DnssecRecordType, DnssecStatus, DomainAttributeKey, DomainAvailabilityStatus, DomainClientStatus, DomainContactType, DomainSortField, DomainStatus, EmailVerificationStatus, EventObjectType, EventSortField, EventSubtype, EventType, GrantType, LaunchPhaseType, LocalPresenceRequirementType, OrganizationStatus, PatchOp, PeriodUnit, Permission, PostTransferRequirements, PostalAddressType, PremiumAffectsType, PremiumSourceType, RegistrantChangeType, RegistryHandleAttributeType, Relation, RenewalMode, ReservedSourceType, SortOrder, SyncOperationType, TLDType, TransferAckType, UserStatus, VerificationType, ZoneSortField } from './schemas';
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* AllocationMethodType. Auto-generated enum for AllocationMethodType
|
|
@@ -1387,6 +1387,56 @@ export const EVENT_OBJECT_TYPE_VALUES = [
|
|
|
1387
1387
|
'UNKNOWN'
|
|
1388
1388
|
] as const satisfies [string, ...string[]] | EventObjectType[];
|
|
1389
1389
|
|
|
1390
|
+
/**
|
|
1391
|
+
* EventSortField. Auto-generated enum for EventSortField
|
|
1392
|
+
*
|
|
1393
|
+
* @remarks
|
|
1394
|
+
* This constant provides both object and array forms for the EventSortField enum.
|
|
1395
|
+
* The object form allows key-value access, while the array form enables iteration and validation.
|
|
1396
|
+
*
|
|
1397
|
+
* @example
|
|
1398
|
+
* ```typescript
|
|
1399
|
+
* // Using the object form for key-value access
|
|
1400
|
+
* const status = EVENT_SORT_FIELD.SUCCESS;
|
|
1401
|
+
*
|
|
1402
|
+
* // Using the array form for iteration
|
|
1403
|
+
* const allStatuses = EVENT_SORT_FIELD_VALUES;
|
|
1404
|
+
* console.log(`Available statuses: ${allStatuses.join(', ')}`);
|
|
1405
|
+
* ```
|
|
1406
|
+
*
|
|
1407
|
+
* @see {@link EventSortField} - The TypeScript type definition
|
|
1408
|
+
*/
|
|
1409
|
+
export const EVENT_SORT_FIELD = {
|
|
1410
|
+
OBJECT_ID: "object_id",
|
|
1411
|
+
CREATED_ON: "created_on",
|
|
1412
|
+
} as const satisfies Record<string, EventSortField>;
|
|
1413
|
+
|
|
1414
|
+
/**
|
|
1415
|
+
* Array of all EventSortField enum values
|
|
1416
|
+
*
|
|
1417
|
+
* @remarks
|
|
1418
|
+
* This constant provides a array containing all valid EventSortField enum values.
|
|
1419
|
+
* Useful for iteration, validation, and generating dynamic UI components.
|
|
1420
|
+
*
|
|
1421
|
+
* @example
|
|
1422
|
+
* ```typescript
|
|
1423
|
+
* // Iterating through all values
|
|
1424
|
+
* for (const value of EVENT_SORT_FIELD_VALUES) {
|
|
1425
|
+
* console.log(`Processing: ${value}`);
|
|
1426
|
+
* }
|
|
1427
|
+
*
|
|
1428
|
+
* // Validation
|
|
1429
|
+
* const isValid = EVENT_SORT_FIELD_VALUES.includes(someValue);
|
|
1430
|
+
* ```
|
|
1431
|
+
*
|
|
1432
|
+
* @see {@link EventSortField} - The TypeScript type definition
|
|
1433
|
+
* @see {@link EVENT_SORT_FIELD} - The object form of this enum
|
|
1434
|
+
*/
|
|
1435
|
+
export const EVENT_SORT_FIELD_VALUES = [
|
|
1436
|
+
'object_id',
|
|
1437
|
+
'created_on'
|
|
1438
|
+
] as const satisfies [string, ...string[]] | EventSortField[];
|
|
1439
|
+
|
|
1390
1440
|
/**
|
|
1391
1441
|
* EventSubtype. Auto-generated enum for EventSubtype
|
|
1392
1442
|
*
|
|
@@ -2443,7 +2443,7 @@ export type PATCH_EmailForwardsZoneNameEnable_Request_Path = PATCH_EmailForwards
|
|
|
2443
2443
|
* Request type for GET Events endpoint
|
|
2444
2444
|
*
|
|
2445
2445
|
* Get pending events
|
|
2446
|
-
* Retrieves a paginated list of
|
|
2446
|
+
* Retrieves a paginated list of events for the organization
|
|
2447
2447
|
*
|
|
2448
2448
|
* @remarks
|
|
2449
2449
|
* This type defines the complete request structure for the GET Events endpoint.
|
|
@@ -3581,7 +3581,7 @@ export type PATCH_EmailForwardsByZoneNameEnable_Response_422 = HTTPValidationErr
|
|
|
3581
3581
|
* Response types for GET Events endpoint
|
|
3582
3582
|
*
|
|
3583
3583
|
* Get pending events
|
|
3584
|
-
* Retrieves a paginated list of
|
|
3584
|
+
* Retrieves a paginated list of events for the organization
|
|
3585
3585
|
*
|
|
3586
3586
|
* @remarks
|
|
3587
3587
|
* This type defines all possible response structures for the GET Events endpoint.
|
package/src/helpers/schemas.d.ts
CHANGED
|
@@ -1450,6 +1450,22 @@ export type EventResponse = components['schemas']['EventResponse'];
|
|
|
1450
1450
|
* @see {@link components} - The OpenAPI components schema definition
|
|
1451
1451
|
*/
|
|
1452
1452
|
export type EventSchema = components['schemas']['EventSchema'];
|
|
1453
|
+
/**
|
|
1454
|
+
* EventSortField
|
|
1455
|
+
*
|
|
1456
|
+
* @remarks
|
|
1457
|
+
* Type alias for the `EventSortField` OpenAPI schema.
|
|
1458
|
+
* This type represents eventsortfield data structures used in API requests and responses.
|
|
1459
|
+
*
|
|
1460
|
+
* @example
|
|
1461
|
+
* ```typescript
|
|
1462
|
+
* const response = await api.getEventSortField();
|
|
1463
|
+
* const item: EventSortField = response.results;
|
|
1464
|
+
* ```
|
|
1465
|
+
*
|
|
1466
|
+
* @see {@link components} - The OpenAPI components schema definition
|
|
1467
|
+
*/
|
|
1468
|
+
export type EventSortField = components['schemas']['EventSortField'];
|
|
1453
1469
|
/**
|
|
1454
1470
|
* EventSubtype
|
|
1455
1471
|
*
|
package/src/openapi.yaml
CHANGED
|
@@ -2383,6 +2383,12 @@ components:
|
|
|
2383
2383
|
- source
|
|
2384
2384
|
title: EventSchema
|
|
2385
2385
|
type: object
|
|
2386
|
+
EventSortField:
|
|
2387
|
+
enum:
|
|
2388
|
+
- object_id
|
|
2389
|
+
- created_on
|
|
2390
|
+
title: EventSortField
|
|
2391
|
+
type: string
|
|
2386
2392
|
EventSubtype:
|
|
2387
2393
|
enum:
|
|
2388
2394
|
- NOTIFICATION
|
|
@@ -4909,151 +4915,44 @@ components:
|
|
|
4909
4915
|
tokenUrl: token
|
|
4910
4916
|
type: oauth2
|
|
4911
4917
|
info:
|
|
4912
|
-
description:
|
|
4913
|
-
|
|
4914
|
-
|
|
4915
|
-
|
|
4916
|
-
|
|
4917
|
-
|
|
4918
|
-
|
|
4919
|
-
|
|
4920
|
-
|
|
4921
|
-
|
|
4922
|
-
|
|
4923
|
-
|
|
4924
|
-
|
|
4925
|
-
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
4945
|
-
|
|
4946
|
-
|
|
4947
|
-
\ types).\n - At non-apex names, an `ALIAS` cannot coexist with any other record\
|
|
4948
|
-
\ type (behaves like `CNAME` exclusivity).\n\nUnit tests: `tests/unit/models/test_dns_validation.py::TestZoneValidation`,\
|
|
4949
|
-
\ `tests/unit/service/dns/test_additional_dns_validations.py` (MX, wildcard, ALIAS),\
|
|
4950
|
-
\ `tests/unit/service/dns/test_rrset_validation.py` (relative names and invalid\
|
|
4951
|
-
\ zone names).\n\n### RRSet-level validation\n\n- **Name must be inside zone**:\
|
|
4952
|
-
\ RRSet name must either equal the zone apex or end with `.{zone_name}`.\n- **RRSet\
|
|
4953
|
-
\ name hostname checks**: RRSet names are validated with general hostname rules,\
|
|
4954
|
-
\ taking into account RRSet type for underscore allowance.\n- **Relative name\
|
|
4955
|
-
\ normalization** (service-level helper):\n - `@` or empty name resolves to the\
|
|
4956
|
-
\ zone apex.\n - Names without a trailing dot become FQDNs relative to the zone.\n\
|
|
4957
|
-
\ - Already-FQDN names are preserved.\n- **Error aggregation shape for RRSet**:\n\
|
|
4958
|
-
\ - RRSet-level errors are listed under `errors[\"rrsets\"][<rrset_name>][\"\
|
|
4959
|
-
rrset\"]`.\n - Record-level errors are listed under `errors[\"rrsets\"][<rrset_name>][\"\
|
|
4960
|
-
records\"][<record_rdata>]`.\n\nUnit tests: `tests/unit/service/dns/test_rrset_validation.py`\
|
|
4961
|
-
\ (relative `@`, relative `www`, invalid `invalid-subdomain-`), `tests/unit/models/test_dns_validation.py::TestZoneValidation`\
|
|
4962
|
-
\ (invalid RRSet names).\n\n### Record-level validation engine\n\n- **Parsing**:\
|
|
4963
|
-
\ For all supported types except `ALIAS`, the system delegates RDATA parsing to\
|
|
4964
|
-
\ `dnspython` via `dns.rdata.from_text` for the appropriate type.\n- **Target\
|
|
4965
|
-
\ hostnames**: For `CNAME`, `NS`, `PTR`, `SRV`, and `MX`, the parsed target hostname\
|
|
4966
|
-
\ (`target` or `exchange`) is further validated with the general hostname rules\
|
|
4967
|
-
\ and underscore allowance for the RRSet type.\n- **RDATA normalization before\
|
|
4968
|
-
\ parse**:\n - `CNAME`, `NS`, `PTR`: the RDATA hostname is normalized to lowercase\
|
|
4969
|
-
\ with a trailing dot.\n - `SRV`: the trailing hostname portion is normalized;\
|
|
4970
|
-
\ numeric fields are preserved.\n - `MX`: the trailing target hostname is normalized;\
|
|
4971
|
-
\ the priority is preserved.\n- **ALIAS special case**: `ALIAS` RDATA is treated\
|
|
4972
|
-
\ as a hostname and validated directly (not parsed by `dnspython`) and must be\
|
|
4973
|
-
\ a valid hostname per the RRSet\u2019s underscore rules.\n- **Error mapping**:\
|
|
4974
|
-
\ `dnspython` exceptions are mapped to user-facing messages such as:\n - \"Invalid\
|
|
4975
|
-
\ <TYPE> record format: <rdata>\"\n - \"Invalid <TYPE> record data: <rdata>\"\
|
|
4976
|
-
\n - \"<TYPE> record validation failed: <detail>\"\n - The top-level detail\
|
|
4977
|
-
\ for the record error is standardized to \"<TYPE> record is not in the expected\
|
|
4978
|
-
\ format\".\n\nUnit tests: `tests/unit/models/test_dns_validation.py::TestRecordValidationErrors`\
|
|
4979
|
-
\ (A, AAAA, CNAME, MX malformed), plus aggregation and structure assertions.\n\
|
|
4980
|
-
\n### Type-specific rules and examples\n\n- **A**:\n - RDATA must be a valid\
|
|
4981
|
-
\ IPv4 address.\n - Example invalid: `not.an.ip` \u2192 parse fails.\n- **AAAA**:\n\
|
|
4982
|
-
\ - RDATA must be a valid IPv6 address.\n - Example invalid: `??::completely::invalid::ipv6`\
|
|
4983
|
-
\ \u2192 parse fails.\n- **CNAME**:\n - RDATA is a hostname; target is validated;\
|
|
4984
|
-
\ name-level exclusivity enforced at zone level (cannot coexist with other non-DNSSEC\
|
|
4985
|
-
\ types at same name).\n - Underscores allowed in name/target.\n- **MX**:\n \
|
|
4986
|
-
\ - RDATA: `<priority> <target-hostname>`\n - Priority range: 0\u201365535 (integer).\
|
|
4987
|
-
\ Invalid or out-of-range triggers errors.\n - Target hostname cannot be a CNAME\
|
|
4988
|
-
\ name, and cannot be an IP address.\n - Target hostname is normalized and validated.\n\
|
|
4989
|
-
- **NS**:\n - RDATA is a hostname; target is validated.\n - NS cannot use wildcard\
|
|
4990
|
-
\ names (i.e., RRSet name cannot be `*.example.com.`).\n- **PTR**:\n - RDATA\
|
|
4991
|
-
\ is a hostname; target is validated.\n- **SRV**:\n - RDATA: `<priority> <weight>\
|
|
4992
|
-
\ <port> <target-hostname>`; target hostname normalized and validated.\n - Underscores\
|
|
4993
|
-
\ allowed (service labels per RFC 2782).\n- **TXT**:\n - Delegated to `dnspython`\
|
|
4994
|
-
\ for parsing; underscores allowed in names.\n - Note: A TODO exists to enforce\
|
|
4995
|
-
\ quotes for TXT content in the future.\n- **CAA**, **SMIMEA**, **TLSA**, **URI**:\n\
|
|
4996
|
-
\ - Delegated to `dnspython` for parsing; underscores allowed in names.\n- **ALIAS**:\n\
|
|
4997
|
-
\ - Treated like a hostname alias (not an RFC standard RRType); normalized and\
|
|
4998
|
-
\ validated as a hostname.\n - Conflicts/DNSSEC rules as described in the zone-level\
|
|
4999
|
-
\ section.\n- **DNSKEY**, **DS** (DNSSEC):\n - Not parsed/validated here beyond\
|
|
5000
|
-
\ coexistence logic; allowed to coexist with `CNAME` but disallowed with `ALIAS`\
|
|
5001
|
-
\ when DNSSEC is present.\n\nUnit tests: cover A/AAAA/CNAME/MX malformed cases;\
|
|
5002
|
-
\ underscore handling across many types; ALIAS, wildcard, and DNSSEC compatibility\
|
|
5003
|
-
\ in `tests/unit/service/dns/test_additional_dns_validations.py`.\n\n### Wildcard\
|
|
5004
|
-
\ handling\n\n- `*` is allowed only as the entire leftmost label of a name (e.g.,\
|
|
5005
|
-
\ `*.example.com.`).\n- Any `*` embedded within a label or not in the leftmost\
|
|
5006
|
-
\ position is invalid.\n- `NS` records cannot be defined at wildcard names.\n\n\
|
|
5007
|
-
Unit tests: Wildcard NS invalid; wildcard A alongside explicit siblings and at\
|
|
5008
|
-
\ different levels is allowed.\n\n### Underscore handling (by RRSet type)\n\n\
|
|
5009
|
-
- Allowed in hostnames for types: `CNAME`, `ALIAS`, `TXT`, `CAA`, `SRV`, `SMIMEA`,\
|
|
5010
|
-
\ `TLSA`, `URI`.\n- Disallowed for: `A`, `AAAA`, `NS`, `MX`, `PTR`, `SOA`, `DNSKEY`,\
|
|
5011
|
-
\ `DS`.\n- Applies both at the start of labels (e.g., `_service`) and in the middle\
|
|
5012
|
-
\ (`my_service`), per tests.\n\nUnit tests: `tests/unit/models/test_dns_validation.py::TestUnderscoreHandling`\
|
|
5013
|
-
\ parameterized cases across types.\n\n### Blocked hostnames\n\n- A curated list\
|
|
5014
|
-
\ of blocked apex names (e.g., major providers\u2019 zones) cannot be added as\
|
|
5015
|
-
\ zones. The check is performed on the dotted-stripped value (no trailing dot).\n\
|
|
5016
|
-
\n### Error response shape\n\n- Zone-level failure raises `DnsZoneValidationError`\
|
|
5017
|
-
\ with `extras.errors` containing:\n - `zone_name`: either a string or a nested\
|
|
5018
|
-
\ mapping of specific hostname errors\n - `rrsets`: mapping of RRSet name \u2192\
|
|
5019
|
-
\ `{ \"rrset\": [..], \"records\": { rdata \u2192 [..] } }`\n - Optional sections\
|
|
5020
|
-
\ when relevant: `cname_conflicts`, `mx_validation`, `wildcard_conflicts`, `alias_conflicts`\n\
|
|
5021
|
-
- RRSet-level failure raises `DnsRrsetValidationError` with a similarly structured\
|
|
5022
|
-
\ `errors` mapping for that RRSet.\n- Record-level failures are aggregated into\
|
|
5023
|
-
\ the RRSet structure above.\n\nUnit tests: Assert shapes and representative messages\
|
|
5024
|
-
\ in `tests/unit/models/test_dns_validation.py::TestRecordValidationErrors::test_error_response_structure`.\n\
|
|
5025
|
-
\n### Key normalizers and helpers\n\n- `normalize_zone_name(s)`: lowercases and\
|
|
5026
|
-
\ ensures a trailing dot.\n- `convert_rrset_name(name, zone)`: resolves `@`/empty\
|
|
5027
|
-
\ to apex and converts relative names to FQDNs under the zone.\n- The record validator\
|
|
5028
|
-
\ normalizes hostnames within RDATA for `CNAME`, `NS`, `PTR`, `SRV`, and `MX`\
|
|
5029
|
-
\ before parsing/validation.\n\n### API behavior around trailing dots (for context)\n\
|
|
5030
|
-
\n- API endpoints accept both with/without trailing dot in the path; zone names\
|
|
5031
|
-
\ are normalized internally. This is orthogonal to validation rules but relevant\
|
|
5032
|
-
\ to how names are handled at the boundary.\n\n---\n\nReferences (tests):\n- `tests/unit/models/test_dns_validation.py`\n\
|
|
5033
|
-
- `tests/unit/service/dns/test_additional_dns_validations.py`\n- `tests/unit/service/dns/test_rrset_validation.py`\n\
|
|
5034
|
-
- `tests/unit/api/dns/test_v1.py`, `tests/unit/api/dns/test_dns.py` (API normalization)\n\
|
|
5035
|
-
\nReferences (implementation):\n- `common/models/dns/validation.py`\n- `common/services/dns/utils.py`\n\
|
|
5036
|
-
- `common/lib/utils/dns.py`\n- `common/models/dns/blocked_domains.py`\n\n\n\n\n\
|
|
5037
|
-
# Resource IDs\n\nThe API uses extensively [Type IDs](https://github.com/jetify-com/typeid):\
|
|
5038
|
-
\ type-safe, K-sortable, globally unique identifier inspired by Stripe IDs. They\
|
|
5039
|
-
\ can be easily identified with a format like `prefix_01jxe1nzrmf78scaqbkjx0va0f`.\
|
|
5040
|
-
\ The `prefix` gives context to the ID - some examples include `user`, `organization`,\
|
|
5041
|
-
\ `domain`. The rest of the ID is a 128-bit UUIDv7 encoded as a 26-character string\
|
|
5042
|
-
\ using a modified base32 encoding. See [formal specification for details](https://github.com/jetify-com/typeid/tree/main/spec).\n\
|
|
5043
|
-
\nThis approach allows using unique IDs (UUIDv7), preventing iteration attacks,\
|
|
5044
|
-
\ while also easily identifying the \"namespace\" of the ID. `01975c1f-a15a-7f6c-a5ce-b75fe33de079`\
|
|
5045
|
-
\ is hardly distuingishable from `01975c1f-f120-7874-8dc2-de7d728bf261` by humans\
|
|
5046
|
-
\ on first glance. However, when represented as Type IDs, they could be represented\
|
|
5047
|
-
\ as `user_01jxe1z8atfxpabknqbzhkvr3s` and `domain_01jxe1zw90f1t8vgpyfns8qwk1`,\
|
|
5048
|
-
\ immediately making it easier to differentiate between them.\n\nAdditionally,\
|
|
5049
|
-
\ this gives type safety and additional validation that can be done. There's [libraries\
|
|
5050
|
-
\ available for many languages to make handling Type IDs easier](https://github.com/jetify-com/typeid?tab=readme-ov-file#official-implementations-by-jetify).\
|
|
5051
|
-
\ We're using them ourselves on the backend to quickly catch mistakes like passing\
|
|
5052
|
-
\ the wrong Type ID (passing a user ID like `user_01jxe1z8atfxpabknqbzhkvr3s`\
|
|
5053
|
-
\ where a domain ID `domain_01jxe1zw90f1t8vgpyfns8qwk1` was expected).\n\n\n"
|
|
4918
|
+
description: '# Authentication
|
|
4919
|
+
|
|
4920
|
+
|
|
4921
|
+
Describes authentication approach.
|
|
4922
|
+
|
|
4923
|
+
|
|
4924
|
+
|
|
4925
|
+
# Resource IDs
|
|
4926
|
+
|
|
4927
|
+
|
|
4928
|
+
The API uses extensively [Type IDs](https://github.com/jetify-com/typeid): type-safe,
|
|
4929
|
+
K-sortable, globally unique identifier inspired by Stripe IDs. They can be easily
|
|
4930
|
+
identified with a format like `prefix_01jxe1nzrmf78scaqbkjx0va0f`. The `prefix`
|
|
4931
|
+
gives context to the ID - some examples include `user`, `organization`, `domain`.
|
|
4932
|
+
The rest of the ID is a 128-bit UUIDv7 encoded as a 26-character string using
|
|
4933
|
+
a modified base32 encoding. See [formal specification for details](https://github.com/jetify-com/typeid/tree/main/spec).
|
|
4934
|
+
|
|
4935
|
+
|
|
4936
|
+
This approach allows using unique IDs (UUIDv7), preventing iteration attacks,
|
|
4937
|
+
while also easily identifying the "namespace" of the ID. `01975c1f-a15a-7f6c-a5ce-b75fe33de079`
|
|
4938
|
+
is hardly distuingishable from `01975c1f-f120-7874-8dc2-de7d728bf261` by humans
|
|
4939
|
+
on first glance. However, when represented as Type IDs, they could be represented
|
|
4940
|
+
as `user_01jxe1z8atfxpabknqbzhkvr3s` and `domain_01jxe1zw90f1t8vgpyfns8qwk1`,
|
|
4941
|
+
immediately making it easier to differentiate between them.
|
|
4942
|
+
|
|
4943
|
+
|
|
4944
|
+
Additionally, this gives type safety and additional validation that can be done.
|
|
4945
|
+
There''s [libraries available for many languages to make handling Type IDs easier](https://github.com/jetify-com/typeid?tab=readme-ov-file#official-implementations-by-jetify).
|
|
4946
|
+
We''re using them ourselves on the backend to quickly catch mistakes like passing
|
|
4947
|
+
the wrong Type ID (passing a user ID like `user_01jxe1z8atfxpabknqbzhkvr3s` where
|
|
4948
|
+
a domain ID `domain_01jxe1zw90f1t8vgpyfns8qwk1` was expected).
|
|
4949
|
+
|
|
4950
|
+
|
|
4951
|
+
|
|
4952
|
+
'
|
|
5054
4953
|
summary: OpusDNS - your gateway to a seamless domain management experience.
|
|
5055
4954
|
title: OpusDNS API
|
|
5056
|
-
version: 2025-10-
|
|
4955
|
+
version: 2025-10-27-080440
|
|
5057
4956
|
x-logo:
|
|
5058
4957
|
altText: OpusDNS API Reference
|
|
5059
4958
|
url: https://d24lr4zqs1tgqh.cloudfront.net/c9505a20-5ae1-406c-b060-d392569caebf.jpg
|
|
@@ -6055,6 +5954,55 @@ paths:
|
|
|
6055
5954
|
requestBody:
|
|
6056
5955
|
content:
|
|
6057
5956
|
application/json:
|
|
5957
|
+
examples:
|
|
5958
|
+
business_setup:
|
|
5959
|
+
description: A comprehensive setup for a business with multiple subdomains
|
|
5960
|
+
and services
|
|
5961
|
+
summary: Business setup with multiple services
|
|
5962
|
+
value:
|
|
5963
|
+
dnssec_status: enabled
|
|
5964
|
+
name: example.com
|
|
5965
|
+
rrsets:
|
|
5966
|
+
- name: '@'
|
|
5967
|
+
records:
|
|
5968
|
+
- rdata: 203.0.113.10
|
|
5969
|
+
ttl: 600
|
|
5970
|
+
type: A
|
|
5971
|
+
- name: www
|
|
5972
|
+
records:
|
|
5973
|
+
- rdata: example.com.
|
|
5974
|
+
ttl: 300
|
|
5975
|
+
type: CNAME
|
|
5976
|
+
- name: api
|
|
5977
|
+
records:
|
|
5978
|
+
- rdata: 203.0.113.20
|
|
5979
|
+
ttl: 300
|
|
5980
|
+
type: A
|
|
5981
|
+
- name: mail
|
|
5982
|
+
records:
|
|
5983
|
+
- rdata: 203.0.113.30
|
|
5984
|
+
ttl: 300
|
|
5985
|
+
type: A
|
|
5986
|
+
- name: '@'
|
|
5987
|
+
records:
|
|
5988
|
+
- rdata: 10 mail.example.com.
|
|
5989
|
+
- rdata: 20 backup-mail.example.com.
|
|
5990
|
+
ttl: 300
|
|
5991
|
+
type: MX
|
|
5992
|
+
- name: '@'
|
|
5993
|
+
records:
|
|
5994
|
+
- rdata: '"v=spf1 include:_spf.google.com ~all"'
|
|
5995
|
+
- rdata: '"google-site-verification=abc123def456"'
|
|
5996
|
+
ttl: 300
|
|
5997
|
+
type: TXT
|
|
5998
|
+
minimal_setup:
|
|
5999
|
+
description: Create a zone with just the zone name - SOA and NS records
|
|
6000
|
+
are automatically generated
|
|
6001
|
+
summary: Minimal zone creation
|
|
6002
|
+
value:
|
|
6003
|
+
dnssec_status: disabled
|
|
6004
|
+
name: example.com
|
|
6005
|
+
rrsets: []
|
|
6058
6006
|
schema:
|
|
6059
6007
|
$ref: '#/components/schemas/DnsZoneCreate'
|
|
6060
6008
|
required: true
|
|
@@ -6062,12 +6010,126 @@ paths:
|
|
|
6062
6010
|
'201':
|
|
6063
6011
|
content:
|
|
6064
6012
|
application/json:
|
|
6013
|
+
examples:
|
|
6014
|
+
business_setup_response:
|
|
6015
|
+
description: Changeset response when creating a comprehensive business
|
|
6016
|
+
zone
|
|
6017
|
+
summary: Response for business setup creation
|
|
6018
|
+
value:
|
|
6019
|
+
changes:
|
|
6020
|
+
- action: create_zone
|
|
6021
|
+
- action: create_record
|
|
6022
|
+
record_data: example.com.
|
|
6023
|
+
rrset_name: www.example.com.
|
|
6024
|
+
rrset_type: CNAME
|
|
6025
|
+
ttl: 300
|
|
6026
|
+
- action: create_record
|
|
6027
|
+
record_data: 203.0.113.30
|
|
6028
|
+
rrset_name: mail.example.com.
|
|
6029
|
+
rrset_type: A
|
|
6030
|
+
ttl: 300
|
|
6031
|
+
- action: create_record
|
|
6032
|
+
record_data: 203.0.113.20
|
|
6033
|
+
rrset_name: api.example.com.
|
|
6034
|
+
rrset_type: A
|
|
6035
|
+
ttl: 300
|
|
6036
|
+
- action: create_record
|
|
6037
|
+
record_data: '"google-site-verification=abc123def456"'
|
|
6038
|
+
rrset_name: example.com.
|
|
6039
|
+
rrset_type: TXT
|
|
6040
|
+
ttl: 300
|
|
6041
|
+
- action: create_record
|
|
6042
|
+
record_data: '"v=spf1 include:_spf.google.com ~all"'
|
|
6043
|
+
rrset_name: example.com.
|
|
6044
|
+
rrset_type: TXT
|
|
6045
|
+
ttl: 300
|
|
6046
|
+
- action: create_record
|
|
6047
|
+
record_data: 10 mail.example.com.
|
|
6048
|
+
rrset_name: example.com.
|
|
6049
|
+
rrset_type: MX
|
|
6050
|
+
ttl: 300
|
|
6051
|
+
- action: create_record
|
|
6052
|
+
record_data: 20 backup-mail.example.com.
|
|
6053
|
+
rrset_name: example.com.
|
|
6054
|
+
rrset_type: MX
|
|
6055
|
+
ttl: 300
|
|
6056
|
+
- action: create_record
|
|
6057
|
+
record_data: ns1.opusdns.com. hostmaster.opusdns.com. 2025101401
|
|
6058
|
+
10800 3600 604800 300
|
|
6059
|
+
rrset_name: example.com.
|
|
6060
|
+
rrset_type: SOA
|
|
6061
|
+
ttl: 3600
|
|
6062
|
+
- action: create_record
|
|
6063
|
+
record_data: ns1.opusdns.com.
|
|
6064
|
+
rrset_name: example.com.
|
|
6065
|
+
rrset_type: NS
|
|
6066
|
+
ttl: 3600
|
|
6067
|
+
- action: create_record
|
|
6068
|
+
record_data: ns2.opusdns.com.
|
|
6069
|
+
rrset_name: example.com.
|
|
6070
|
+
rrset_type: NS
|
|
6071
|
+
ttl: 3600
|
|
6072
|
+
- action: create_record
|
|
6073
|
+
record_data: 203.0.113.10
|
|
6074
|
+
rrset_name: example.com.
|
|
6075
|
+
rrset_type: A
|
|
6076
|
+
ttl: 600
|
|
6077
|
+
- action: create_record
|
|
6078
|
+
record_data: 256 3 13 4epAMhnUgbFbAmKI2zbTXXFHGlVeHamiWLPdwJ8ehE9NgmvDNraqYF/0YdDcoc2elyelvi72KJyQfIR02axEeQ==
|
|
6079
|
+
rrset_name: example.com.
|
|
6080
|
+
rrset_type: DNSKEY
|
|
6081
|
+
ttl: 300
|
|
6082
|
+
- action: create_record
|
|
6083
|
+
record_data: 257 3 13 Wx1Wk8Sl+PyanAWPYsCPw9qFv2Nv0U/MXoJGgpmdqgbLgtvPlVM1/66j/MFTOjk4ONGKGZoWbZ86ud18lWvacw==
|
|
6084
|
+
rrset_name: example.com.
|
|
6085
|
+
rrset_type: DNSKEY
|
|
6086
|
+
ttl: 300
|
|
6087
|
+
- action: create_record
|
|
6088
|
+
record_data: 17781 13 2 21d0b2b21f501935546de33505a2b43d16ba3b1f375e00b0386dae3942165915
|
|
6089
|
+
rrset_name: example.com.
|
|
6090
|
+
rrset_type: DS
|
|
6091
|
+
ttl: 300
|
|
6092
|
+
- action: create_record
|
|
6093
|
+
record_data: 17781 13 4 d10ab2a071c85c20a0338797401928255be1d08c470236b381fbd87df0d60e3aab5d86c6dee8356374167d9b68652608
|
|
6094
|
+
rrset_name: example.com.
|
|
6095
|
+
rrset_type: DS
|
|
6096
|
+
ttl: 300
|
|
6097
|
+
- action: enable_dnssec
|
|
6098
|
+
changeset_id: 108e6028-2812-4bd9-aa41-5b46cdc7fbdc
|
|
6099
|
+
num_changes: 17
|
|
6100
|
+
zone_name: example.com.
|
|
6101
|
+
minimal_setup_response:
|
|
6102
|
+
description: Changeset response when creating a zone with automatic
|
|
6103
|
+
SOA and NS records
|
|
6104
|
+
summary: Response for minimal zone creation
|
|
6105
|
+
value:
|
|
6106
|
+
changes:
|
|
6107
|
+
- action: create_zone
|
|
6108
|
+
- action: create_record
|
|
6109
|
+
record_data: ns1.opusdns.com. hostmaster.opusdns.com. 2025101401
|
|
6110
|
+
10800 3600 604800 300
|
|
6111
|
+
rrset_name: example.com.
|
|
6112
|
+
rrset_type: SOA
|
|
6113
|
+
ttl: 3600
|
|
6114
|
+
- action: create_record
|
|
6115
|
+
record_data: ns1.opusdns.com.
|
|
6116
|
+
rrset_name: example.com.
|
|
6117
|
+
rrset_type: NS
|
|
6118
|
+
ttl: 3600
|
|
6119
|
+
- action: create_record
|
|
6120
|
+
record_data: ns2.opusdns.com.
|
|
6121
|
+
rrset_name: example.com.
|
|
6122
|
+
rrset_type: NS
|
|
6123
|
+
ttl: 3600
|
|
6124
|
+
changeset_id: de28f689-b400-45b7-9f67-9f92d512935a
|
|
6125
|
+
num_changes: 4
|
|
6126
|
+
zone_name: example.com.
|
|
6065
6127
|
schema:
|
|
6066
6128
|
anyOf:
|
|
6067
6129
|
- $ref: '#/components/schemas/DnsChangesResponse'
|
|
6068
6130
|
- type: 'null'
|
|
6069
6131
|
title: Response Create Zone V1 Dns Post
|
|
6070
|
-
description:
|
|
6132
|
+
description: Zone created successfully
|
|
6071
6133
|
'400':
|
|
6072
6134
|
content:
|
|
6073
6135
|
application/problem+json:
|
|
@@ -6083,9 +6145,25 @@ paths:
|
|
|
6083
6145
|
'422':
|
|
6084
6146
|
content:
|
|
6085
6147
|
application/problem+json:
|
|
6148
|
+
examples:
|
|
6149
|
+
typo_in_name:
|
|
6150
|
+
description: The request contains a typo in the name field
|
|
6151
|
+
summary: Typo in name
|
|
6152
|
+
value:
|
|
6153
|
+
errors:
|
|
6154
|
+
- input:
|
|
6155
|
+
nme: example.com
|
|
6156
|
+
loc:
|
|
6157
|
+
- body
|
|
6158
|
+
- name
|
|
6159
|
+
msg: Field required
|
|
6160
|
+
type: missing
|
|
6161
|
+
status: 422
|
|
6162
|
+
title: Request validation error.
|
|
6163
|
+
type: request-validation-failed
|
|
6086
6164
|
schema:
|
|
6087
6165
|
$ref: '#/components/schemas/HTTPValidationError'
|
|
6088
|
-
description:
|
|
6166
|
+
description: Invalid request parameters
|
|
6089
6167
|
security:
|
|
6090
6168
|
- OAuth2PasswordBearer: []
|
|
6091
6169
|
summary: Create Zone
|
|
@@ -7961,9 +8039,62 @@ paths:
|
|
|
7961
8039
|
- email_forward
|
|
7962
8040
|
/v1/events:
|
|
7963
8041
|
get:
|
|
7964
|
-
description: Retrieves a paginated list of
|
|
8042
|
+
description: Retrieves a paginated list of events for the organization
|
|
7965
8043
|
operationId: get_events_v1_events_get
|
|
7966
8044
|
parameters:
|
|
8045
|
+
- in: query
|
|
8046
|
+
name: sort_by
|
|
8047
|
+
required: false
|
|
8048
|
+
schema:
|
|
8049
|
+
$ref: '#/components/schemas/EventSortField'
|
|
8050
|
+
default: created_on
|
|
8051
|
+
- in: query
|
|
8052
|
+
name: sort_order
|
|
8053
|
+
required: false
|
|
8054
|
+
schema:
|
|
8055
|
+
$ref: '#/components/schemas/SortOrder'
|
|
8056
|
+
default: desc
|
|
8057
|
+
- in: query
|
|
8058
|
+
name: object_type
|
|
8059
|
+
required: false
|
|
8060
|
+
schema:
|
|
8061
|
+
anyOf:
|
|
8062
|
+
- $ref: '#/components/schemas/EventObjectType'
|
|
8063
|
+
- type: 'null'
|
|
8064
|
+
title: Object Type
|
|
8065
|
+
- in: query
|
|
8066
|
+
name: object_id
|
|
8067
|
+
required: false
|
|
8068
|
+
schema:
|
|
8069
|
+
anyOf:
|
|
8070
|
+
- type: string
|
|
8071
|
+
- type: 'null'
|
|
8072
|
+
title: Object Id
|
|
8073
|
+
- in: query
|
|
8074
|
+
name: type
|
|
8075
|
+
required: false
|
|
8076
|
+
schema:
|
|
8077
|
+
anyOf:
|
|
8078
|
+
- $ref: '#/components/schemas/EventType'
|
|
8079
|
+
- type: 'null'
|
|
8080
|
+
title: Type
|
|
8081
|
+
- in: query
|
|
8082
|
+
name: subtype
|
|
8083
|
+
required: false
|
|
8084
|
+
schema:
|
|
8085
|
+
anyOf:
|
|
8086
|
+
- $ref: '#/components/schemas/EventSubtype'
|
|
8087
|
+
- type: 'null'
|
|
8088
|
+
title: Subtype
|
|
8089
|
+
- in: query
|
|
8090
|
+
name: acknowledged
|
|
8091
|
+
required: false
|
|
8092
|
+
schema:
|
|
8093
|
+
anyOf:
|
|
8094
|
+
- type: boolean
|
|
8095
|
+
- type: 'null'
|
|
8096
|
+
default: false
|
|
8097
|
+
title: Acknowledged
|
|
7967
8098
|
- in: query
|
|
7968
8099
|
name: page
|
|
7969
8100
|
required: false
|
|
@@ -9825,6 +9956,11 @@ tags:
|
|
|
9825
9956
|
'
|
|
9826
9957
|
name: email_forward
|
|
9827
9958
|
x-displayName: Email forwards
|
|
9959
|
+
- description: 'Endpoints for creating and managing domain forwards.
|
|
9960
|
+
|
|
9961
|
+
'
|
|
9962
|
+
name: domain_forward
|
|
9963
|
+
x-displayName: Domain forwards
|
|
9828
9964
|
- description: 'Endpoints for interacting with events.
|
|
9829
9965
|
|
|
9830
9966
|
'
|
|
@@ -9871,5 +10007,6 @@ x-tagGroups:
|
|
|
9871
10007
|
tags:
|
|
9872
10008
|
- dns
|
|
9873
10009
|
- email_forward
|
|
10010
|
+
- domain_forward
|
|
9874
10011
|
- rdap
|
|
9875
10012
|
- domain_search
|
package/src/schema.d.ts
CHANGED
|
@@ -688,7 +688,7 @@ export interface paths {
|
|
|
688
688
|
};
|
|
689
689
|
/**
|
|
690
690
|
* Get pending events
|
|
691
|
-
* @description Retrieves a paginated list of
|
|
691
|
+
* @description Retrieves a paginated list of events for the organization
|
|
692
692
|
*/
|
|
693
693
|
get: operations["get_events_v1_events_get"];
|
|
694
694
|
put?: never;
|
|
@@ -2797,6 +2797,11 @@ export interface components {
|
|
|
2797
2797
|
/** @description The type of the event - indicates the kind of operation occurring (e.g., 'ACCOUNT_CREATE', 'DOMAIN_MODIFICATION') */
|
|
2798
2798
|
type?: components["schemas"]["EventType"] | null;
|
|
2799
2799
|
};
|
|
2800
|
+
/**
|
|
2801
|
+
* EventSortField
|
|
2802
|
+
* @enum {string}
|
|
2803
|
+
*/
|
|
2804
|
+
EventSortField: "object_id" | "created_on";
|
|
2800
2805
|
/**
|
|
2801
2806
|
* EventSubtype
|
|
2802
2807
|
* @enum {string}
|
|
@@ -5364,7 +5369,7 @@ export interface operations {
|
|
|
5364
5369
|
};
|
|
5365
5370
|
};
|
|
5366
5371
|
responses: {
|
|
5367
|
-
/** @description
|
|
5372
|
+
/** @description Zone created successfully */
|
|
5368
5373
|
201: {
|
|
5369
5374
|
headers: {
|
|
5370
5375
|
[name: string]: unknown;
|
|
@@ -5389,7 +5394,7 @@ export interface operations {
|
|
|
5389
5394
|
"application/problem+json": components["schemas"]["Problem"];
|
|
5390
5395
|
};
|
|
5391
5396
|
};
|
|
5392
|
-
/** @description
|
|
5397
|
+
/** @description Invalid request parameters */
|
|
5393
5398
|
422: {
|
|
5394
5399
|
headers: {
|
|
5395
5400
|
[name: string]: unknown;
|
|
@@ -7095,6 +7100,13 @@ export interface operations {
|
|
|
7095
7100
|
get_events_v1_events_get: {
|
|
7096
7101
|
parameters: {
|
|
7097
7102
|
query?: {
|
|
7103
|
+
sort_by?: components["schemas"]["EventSortField"];
|
|
7104
|
+
sort_order?: components["schemas"]["SortOrder"];
|
|
7105
|
+
object_type?: components["schemas"]["EventObjectType"] | null;
|
|
7106
|
+
object_id?: string | null;
|
|
7107
|
+
type?: components["schemas"]["EventType"] | null;
|
|
7108
|
+
subtype?: components["schemas"]["EventSubtype"] | null;
|
|
7109
|
+
acknowledged?: boolean | null;
|
|
7098
7110
|
page?: number;
|
|
7099
7111
|
page_size?: number;
|
|
7100
7112
|
};
|