---
title: "Send publish request for a certain draft id"
method: POST
path: "/policy/draft"
tags: ["Policy Editor V2"]
---

# Send publish request for a certain draft id

`POST /policy/draft`

## Request

- Base URL: `https://api.fireblocks.io/v1`
- URL: `https://api.fireblocks.io/v1/policy/draft`
- Auth: none declared
- TypeScript: <https://skmtc.dev/fireblocks/apis/fireblocks-api/docs/policy/draft/post.ts> (a function with typed inputs; its response is checked against the schema)

Send publish request of certain draft id and returns the response.

**⚠️ IMPORTANT SECURITY NOTICE:**

The Fireblocks Policy is a critical security guardrail. Programmatically modifying your policy via the API introduces significant security risks. As an industry best practice, Fireblocks strongly recommends manual editing accompanied by strict human oversight and approval workflows for all policy changes. Programmatic updates should only be implemented by advanced users with comprehensive, multi-layer security controls in place.

If you want to learn more about the Fireblocks Policy Editor, please contact your Fireblocks Customer Success Manager or send an email to CSM@fireblocks.com.

## Headers

- `Idempotency-Key` string

## Request body

- PublishDraftRequest: Request schema for publishing draft with policy types and draft ID
  - `policyTypes` PolicyType[], required
  - `draftId` string, required: The ID of the draft to publish

## Response `201`

A policy publish result object

- PublishResult: Response object of the publish policy operation
  - `status` 'SUCCESS' | 'UNVALIDATED' | 'INVALID_CONFIGURATION' | 'PENDING' | 'PENDING_CONSOLE_APPROVAL' | 'AWAITING_QUORUM' | 'UNHANDLED_ERROR', required: * SUCCESS - success * UNVALIDATED - not validated yet * INVALID_CONFIGURATION - at least one rule is invalid * PENDING - pending approval * PENDING_CONSOLE_APPROVAL - pending approval from the console app * AWAITING_QUORUM - pending quorum approval * UNHANDLED_ERROR - unhandled error
  - `rules` PolicyRule[], required
    - `name` string, required: Name of the policy rule
    - `id` string, required: Unique identifier for the policy rule
    - `policyEngineVersion` 'v2', required: Policy engine version
    - `type` 'TRANSFER' | 'STAKE' | 'CONTRACT_CALL' | 'TYPED_MESSAGE' | 'APPROVE' | 'MINT' | 'BURN' | 'RAW' | 'COMPLIANCE' | 'DEPLOYMENT' | 'PROGRAM_CALL' | 'DAPP_CONNECTION' | 'UPGRADE' | 'ORDER' | 'AML_CHAINALYSIS_V2_SCREENING' | 'AML_CHAINALYSIS_V2_POST_SCREENING' | 'AML_ELLIPTIC_HOLISTIC_SCREENING' | 'AML_ELLIPTIC_HOLISTIC_POST_SCREENING' | 'TR_NOTABENE_SCREENING' | 'TR_NOTABENE_POST_SCREENING', required: Policy type enumeration
    - `subType` 'TRANSFER' | 'STAKE' | 'CONTRACT_CALL' | 'TYPED_MESSAGE' | 'APPROVE' | 'MINT' | 'BURN' | 'RAW' | 'COMPLIANCE' | 'DEPLOYMENT' | 'PROGRAM_CALL' | 'DAPP_CONNECTION' | 'UPGRADE' | 'ORDER' | 'AML_CHAINALYSIS_V2_SCREENING' | 'AML_CHAINALYSIS_V2_POST_SCREENING' | 'AML_ELLIPTIC_HOLISTIC_SCREENING' | 'AML_ELLIPTIC_HOLISTIC_POST_SCREENING' | 'TR_NOTABENE_SCREENING' | 'TR_NOTABENE_POST_SCREENING': Policy type enumeration
    - `initiator` union, required
      - '*': All users are allowed
      - InitiatorConfig: Policy rule initiator configuration
        - `users` string[]: List of user IDs
        - `groups` string[]: List of policy group IDs
        - `services` string[]
        - `fbAdminGroups` string[]
        - `exchange` string[]
        - `operator` 'INCLUDES': Operator for selection
    - `asset` AssetConfig: Policy asset configuration
      - `nftTransfer` boolean, required: Whether this is an NFT transfer
      - `assetTypes` union[]: List of asset types
        - union
          - string
          - '*'
      - `operator` 'INCLUDES': Operator for selection
    - `source` SourceConfig, required: Source account configuration for policy rules
      - `type` AccountType2[]: Source account types
      - `subType` AccountIdentifier[]: Source account subtypes
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `ids` AccountIdentifier[]: Source account identifiers
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `tags` PolicyTag[]: Tags for source matching
        - `id` string, required: Tag identifier
      - `operator` 'INCLUDES', required: Operator for selection
      - `matchFrom` 'ACCOUNT': Whether to match from account (relevant only for ORDER policy type)
    - `destination` DestinationConfig: Destination configuration for policy rules
      - `type` AccountType2[]: Destination account types
      - `subType` AccountIdentifier[]
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `ids` AccountIdentifier[]
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `tags` PolicyTag[]: Tags for destination matching
        - `id` string, required: Tag identifier
      - `operator` 'INCLUDES', required: Operator for selection
      - `matchFrom` 'ACCOUNT' | 'SOURCE': Whether to match from account or source (relevant only for ORDER policy type). If set to ACCOUNT, only matchFrom is allowed and other fields are not required.
      - `addressType` '*' | 'WHITELISTED' | 'ONE_TIME', required: Type of destination addresses allowed
    - `account` AccountConfig: Policy account configuration
      - `type` AccountType2[]: Account types
      - `subType` AccountIdentifier[]
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `ids` AccountIdentifier[]
        - `type` 'EXCHANGE' | 'UNMANAGED' | 'VAULT' | 'GLOBAL_WHITELIST' | 'NETWORK_CONNECTION' | 'FIAT_ACCOUNT' | 'CONNECTED_ACCOUNT' | 'ONE_TIME_ADDRESS' | 'SRC_DST_NA' | 'MULTIPLE_VENUES' | 'END_USER_WALLET' | 'OEC_PARTNER' | 'CONTRACT' | 'INTERNAL' | 'EXTERNAL' | 'DAPP_CONNECTION' | 'UNKNOWN' | '*' | 'ANY', required: Type of account
        - `id` string: Account ID
        - `subType` string: Account subtype
        - `address` string: Account address
      - `tags` PolicyTag[]: Tags for account matching
        - `id` string, required: Tag identifier
      - `operator` 'INCLUDES', required: Operator for selection
      - `matchFrom` 'ACCOUNT' | 'SOURCE': Whether to match from account or source
    - `side` 'BUY' | 'SELL' | 'ANY': Order side for trading operations
    - `verdict` VerdictConfig, required: Verdict configuration
      - `action` 'ALLOW' | 'BLOCK' | '2-TIER' | 'ACCEPT' | 'REJECT' | 'ALERT' | 'SCREEN' | 'PASS' | 'WAIT' | 'FREEZE' | 'CANCEL', required: Verdict action
      - `approvers` ApproversConfig: Approvers configuration
        - `canInitiatorApprove` boolean, required: Whether initiator can approve
        - `operator` 'AND' | 'OR': Operator for approval groups
        - `allowOperatorAsAuthorizer` boolean: Whether operator can be authorizer
        - `approvalGroups` object[]: List of approval groups
          - `threshold` number, required: Approval threshold
          - `users` string[]: List of user IDs
          - `groups` string[]: List of policy group IDs
      - `designatedSigners` DesignatedSignersConfig: Designated signers configuration
        - `type` 'SINGLE' | 'MULTIPLE' | 'INITIATOR', required: Type of designated signers
        - `users` string[]: List of user IDs
        - `groups` string[]: List of policy group IDs
    - `amountOverTime` AmountOverTimeConfig: Amount over time configuration
      - `range` AmountRangeMinMax2, required: Amount range with minimum and maximum values
        - `min` string, required: Minimum amount
        - `max` string: Maximum amount
      - `currency` 'NATIVE' | 'USD' | 'EUR', required: Currency for the amount
      - `timePeriod` TimePeriodConfig, required: Time period configuration
        - `seconds` string, required: Time period in seconds
        - `initiator` 'PER_SINGLE_MATCH' | 'ACROSS_ALL_MATCHES', required: Type of match for time period application
        - `source` 'PER_SINGLE_MATCH' | 'ACROSS_ALL_MATCHES', required: Type of match for time period application
        - `destination` 'PER_SINGLE_MATCH' | 'ACROSS_ALL_MATCHES', required: Type of match for time period application
    - `amount` AmountConfig: Currency property for amount configuration
      - `range` AmountRangeMinMax2, required: Amount range with minimum and maximum values
        - `min` string, required: Minimum amount
        - `max` string: Maximum amount
      - `currency` 'NATIVE' | 'USD' | 'EUR': Currency for the amount
    - `externalDescriptor` string: External descriptor for the rule
    - `method` union
      - '*': All methods allowed
      - ContractMethodConfig: Contract method configuration
        - `methodCalls` string[], required
        - `operator` 'EITHER' | 'EXACT', required: Operator for method calls
        - `payloadSuffix` string: Payload suffix for method calls
    - `isGlobalPolicy` boolean: Whether this is a global policy
    - `programCall` ProgramCallConfig: Program call configuration
      - `allowedSolanaProgramCalls` '*' | 'WHITELISTED', required: Whether Solana program calls are allowed
    - `screeningMetadata` ScreeningMetadataConfig: Screening metadata configuration
      - `direction` 'INBOUND' | 'OUTBOUND' | 'ANY': Direction of transaction
      - `provider` 'CHAINALYSIS' | 'CHAINALYSIS_V2' | 'ELLIPTIC' | 'ELLIPTIC_HOLISTIC' | 'NOTABENE', nullable: Screening provider
      - `riskRating` 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE' | 'ANY': Risk rating threshold
      - `riskScore` string: Risk score threshold
      - `exposureType` 'DIRECT' | 'INDIRECT' | 'ANY': Exposure type
      - `category` string[]
      - `name` string[]
      - `categoryId` string[]
      - `status` 'COMPLETED' | 'PENDING' | 'REJECTED' | 'FAILED' | 'CANCELED' | 'BLOCKING_TIME_EXPIRED': Transaction status
      - `sourceAddress` string: Source address
      - `destAddress` string: Destination address
    - `quoteAsset` AssetConfig: Policy asset configuration
      - `nftTransfer` boolean, required: Whether this is an NFT transfer
      - `assetTypes` union[]: List of asset types
        - union
          - string
          - '*'
      - `operator` 'INCLUDES': Operator for selection
    - `baseAsset` AssetConfig: Policy asset configuration
      - `nftTransfer` boolean, required: Whether this is an NFT transfer
      - `assetTypes` union[]: List of asset types
        - union
          - string
          - '*'
      - `operator` 'INCLUDES': Operator for selection
    - `quoteAmount` AmountRange: Amount range with minimum and maximum values
      - `range` AmountRangeMinMax2, required: Amount range with minimum and maximum values
        - `min` string, required: Minimum amount
        - `max` string: Maximum amount
    - `baseAmount` AmountRange: Amount range with minimum and maximum values
      - `range` AmountRangeMinMax2, required: Amount range with minimum and maximum values
        - `min` string, required: Minimum amount
        - `max` string: Maximum amount
    - `dAppAddress` DAppAddressConfig: dApp address configuration for policy rules
      - `globalWhitelisted` string[], required: Globally whitelisted addresses
      - `tenantWhitelisted` string[], required: Tenant whitelisted addresses
      - `urls` string[], required: Allowed all address
      - `operator` 'INCLUDES', required: Operator for selection
    - `derivationPath` DerivationPathConfig: Derivation path configuration
      - `path` number[], required: Derivation path as array of numbers
      - `partial` boolean: Whether this is a partial path
    - `index` number: Index for the policy rule
  - `checkResult` PolicyCheckResult, required: Policy rules validation result
    - `errors` number, required: Number of errors
    - `results` PolicyRuleCheckResult[], required: A set of validation results
      - `index` number, required: Rule index number in the policy
      - `status` 'ok' | 'failure', required: Validation status
      - `errors` PolicyRuleError[], required: A set of rule validation error objects
        - `errorMessage` string, required: Error message
        - `errorCode` number, required: error code
        - `errorCodeName` string, required: error code name
        - `errorField` 'operator' | 'operators' | 'authorizationGroups' | 'designatedSigner' | 'designatedSigners' | 'contractMethods' | 'amountAggregation' | 'src' | 'dst', required: The field which the error relates to * operator - transaction initiator * operators - transaction initiators * authorizationGroups - transaction authorizer groups * designatedSigner - transaction signer * designatedSigners - transaction signers * contractMethods - contract methods * amountAggregation - transaction amount aggregation configuration * src - transaction source asset configuration * dst - transaction destination asset configuration
  - `metadata` PolicyMetadata, required: Policy metadata keyed by policy type

## Other responses

- `default`: Error Response

---

[API](https://skmtc.dev/fireblocks/apis/fireblocks-api.md) - [All operations](https://skmtc.dev/fireblocks/apis/fireblocks-api/llms.txt) - [OpenAPI document](https://skmtc.dev/fireblocks/apis/fireblocks-api/revisions/4eba9965659a?raw)
